如何在python 3中将列表写入txt文件?

时间:2019-02-19 16:03:57

标签: python python-3.x

我想制作一个程序(Python 3.6),它可以读取多个日志文件并将这些文件中的所有行写入txt文件。

我已经尝试过的代码可以读取所有行,但是不能将所有行都写入txt文件。我已经尝试过了:

allFiles = glob.glob('C:\Program Files\PostgreSQL\9.6\data\pg_log\*.log')
def readFile(allFiles):
    for file in allFiles:
        f = open(file,'r')
        allLines = []
        for line in f:
            allLines.append(line)
            print(line)
        f.close()

    with open ('readFile.txt',mode='wt', encoding='utf-8') as fileOutput:
        for line in allLines:
            fileOutput.write(line)
        fileoutput.close()

我希望所有文件中的所有行都可以写入txt文件,但是我得到的结果是仅以txt格式写的行与该程序的执行日期相同的行。

我该怎么办?

2 个答案:

答案 0 :(得分:1)

每次读取文件时,会将allLines重置为空列表。将allLines = []行移至for循环之外。换句话说,您的函数的开始应为:

def readFile(allFiles):
    allLines = []
    for file in allFiles:
        f = open(file,'r')

此外,还有一些“样式注释”:使用已在Python中具有含义的变量名称,即使该语言允许,通常也被认为是不好的形式。因此,最好使用“文件”以外的东西。同样,Python约定是在变量名中的单词之间使用下划线,而不是Camel Case。因此,“ allLines”将是“ all_lines”。您可能想在以下位置查看《 Python样式指南》:https://www.python.org/dev/peps/pep-0008/

答案 1 :(得分:1)

alllines仅保存 last 读取文件中的行-因为您在循环内{em> 中将其重置为alllines=[]。您需要在循环之前将其移动(或摆脱它-参见下文)。

简单地合并文件会容易得多:请参见Python concatenate text files


您的代码有第二个/第三个问题-如果您有20个文件,每个文件有1 GB,则会在内存中存储20GB ...,这是非常低效的。

最好逐行写入新文件。此外,在使用文件objcts时,应使用with open(...) as ..:范式:

def readFile(allFiles):
    with open ('readFile.txt', mode='wt', encoding='utf-8') as fileOutput:
        for file in allFiles:
            with open(file) as reader:
                for line in reader:
                    fileOutput.write(line)


allFiles = glob.glob('C:\Program Files\PostgreSQL\9.6\data\pg_log\*.log')
readFile(allFiles)

请参见Python 3.7 - File reading/writing