我想制作一个程序(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格式写的行与该程序的执行日期相同的行。
我该怎么办?
答案 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)