如何从单个目录中的多个文件读取和写入?蟒蛇

时间:2014-06-23 18:20:44

标签: python file parsing csv

我正在编写Python代码,希望能够更深入地了解如何解决此问题。

我正在尝试读取多个文件以便以.log结尾。有了这个,我希望将特定值写入.csv文件。

在文本文件中,有以下提取的X / Y值:

Textfile.log:

    X/Y = 5
    X/Y = 6

Textfile.log.2:

    X/Y = 7
    X/Y = 8 

CSV文件中的DesiredOutput:

    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

2 个答案:

答案 0 :(得分: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"作为第一个条目。

答案 1 :(得分: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)

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