2014-06-23 63 views
1

我正在编写一个Python代码,希望能更深入地了解如何解决这个问题。如何从一个目录中的多个文件读取和写入? Python

我想读取多个文件,以.log结尾。有了这个,我希望将具体的值写入.csv文件。

在文本文件中,有被提取下面X/Y值:

Textfile.log:

X/Y = 5 
    X/Y = 6 

Textfile.log.2:

X/Y = 7 
    X/Y = 8 

DesiredOutput在CSV文件:

5   
    6 
    7 
    8 

下面是代码,我拿出这么远:

def readfile(): 
    import os 
    i = 0 
    for file in os.listdir("\mydir"): 
     if file.endswith(".log"): 
      return file 

    def main(): 
      import re 
     list = [] 
     list = readfile() 

     for line in readfile(): 
      x = re.search(r'(?<=X/Y =)\d+', line) 
      if x: 
       list.append(x.group()) 
      else: 
       break 
     f = csv.write(open(output, "wb")) 
     while 1: 
      if (i>len(list-1)): 
       break 
      else: 
       f.writerow(list(i)) 
       i += 1 

    if __name__ == '__main__': 
    main() 

我对如何使它读取.log文件,然后将.log.2文件混淆。 是否可以让它自动读取1个目录中的所有文件,而无需单独键入它们?

更新:我使用的是Windows 7和Python V2.7

回答

1

最简单的方式来读取顺序文件是建立在它的列表,然后循环。喜欢的东西:

for fname in list_of_files: 
    with open(fname, 'r') as f: 
     #Do all the stuff you do to each file 

这样,不管你做什么,以读取每个文件将被重复和list_of_files应用到每一个文件。由于列表是有序的,它将按照列表排序的顺序进行。

从@The2ndSon的答案借用,你可以拿起os.listdir(dir)的文件。这将以任意顺序列出dir中的所有文件和目录。从此,你可以拉出来和秩序所有的文件是这样的:

allFiles = os.listdir(some_dir) 
logFiles = [fname for fname in allFiles if "log" in fname.split('.')] 
logFiles.sort(key = lambda x: x.split('.')[-1]) 
logFiles[0], logFiles[-1] = logFiles[-1], logFiles[0] 

上面的代码将与文件名工作像"somename.log", "somename.log.2"等。然后您可以采取logFiles并将其作为list_of_files插入。请注意,最后一行仅在第一个文件是"somename.log"而不是"somename.log.1"时是必需的。如果第一个文件对最终的数字,只是排除最后一步

逐行解释:

  • allFiles = os.listdir(some_dir)

这一行需要内some_dir和所有文件和目录将它们作为列表返回

  • logFiles = [fname for fname in allFiles if "log" in fname.split('.')]

执行列表理解,收集名称中包含log的所有文件作为扩展的一部分。将包括"something.log.somethingelse""log_something.somethingelse"不会。

  • logFiles.sort(key = lambda x: x.split('.')[-1])

排序的日志文件在地方由过去的扩展列表。 x.split('.')[-1]将文件名分割成周期分隔值列表并取最后一个条目。如果名字是"name.log.5",它将被排序为"5"。如果名字是"name.log",它将被排序为"log"

  • logFiles[0], logFiles[-1] = logFiles[-1], logFiles[0]

交换的日志文件列表中的第一个和最后一个条目。这是必要的,因为排序操作会将"name.log"作为最后一项,并将"nane.log.1"作为第一项。

+0

啊我明白了,这很有道理。虽然我对list_of_files部分有点困惑。编译器会如何知道如何依次读取Textfile.log和Textfile.log.2? – user3685687

+0

是否有可能让它自动读取所有文件而无需单独键入它们? – user3685687

+0

@ user3685687,是的,python能够读取给定目录中的文件。一旦你的名单,你可以[很容易排序](https://wiki.python.org/moin/HowTo/Sorting),但是你想 – wnnmaw

1

如果更改日志文件的命名方案,您可以轻松地返回具有“.log”扩展名的文件列表。例如,如果您更改文件名Textfile1.log和Textfile2.log可以ReadFile的更新()是:

import os 
def readfile(): 
    my_list = [] 

    for file in os.listdir("."): 
     if file.endswith(".log"): 
      my_list.append(file) 

打印my_list将返回[ 'Textfile1.log', 'Textfile2.log']。通常可以避免使用单词'list'作为变量,因为它也用于python中的对象。

+0

我明白了,不幸的是,这是部分分配。我希望file.endswith可采取的整数,但它不会:( – user3685687

+0

我会wnnmaw的答案。谢谢采纳您的文件读取方法很多@ The2ndSon – user3685687

相关问题