【问题标题】:How would I read and write from multiple files in a single directory? Python我将如何读取和写入单个目录中的多个文件? Python
【发布时间】:2014-08-13 21:27:19
【问题描述】:

我正在编写一个 Python 代码,并希望更深入地了解如何解决这个问题。

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

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

文本文件.log:

    X/Y = 5
    X/Y = 6

文本文件.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

【问题讨论】:

    标签: python file parsing csv


    【解决方案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" 作为第一个条目。

    【讨论】:

    • 啊,我明白了,这很有意义。不过,我对 list_of_files 部分有点困惑。编译器如何知道依次读取 Textfile.log 和 Textfile.log.2?
    • 是否可以让它自动读取所有文件而无需单独输入?
    • @user3685687,是的,python 能够从给定目录中读取文件。一旦你的名单,你可以sort it fairly easily但是你想要的
    • 我将如何处理“list_of_files”部分?对于 "\mydir" 中的 fname,open(fname, 'r') as f: ?这会读取目录中的所有文件吗?
    • @user3685687,取决于您使用的操作系统
    【解决方案2】:

    如果您更改日志文件的命名方案,您可以轻松返回具有“.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 中的对象。

    【讨论】:

    • 啊,我明白了,不幸的是,这是作业的一部分。我希望 file.endswith 可以接受整数,但它没有:(
    • 我会将您的文件读取方法与 wnnmaw 的答案结合起来。非常感谢@The2ndSon
    猜你喜欢
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多