我有数据file.log
,我希望显示来自其他数据过滤器结果的文件file.log
中具有相同值的四个字段list.txt
中的所有行
list.txt
2
3
7
10
12
etc
这是我的代码
import csv
fileopen = open('file.log', 'r')
fileout = open('fileout.txt', 'w')
filefin = open('list.txt', 'r')
for line in fileopen:
col = line.split(',')
if len(col) > 1 and col[3] in filefin.readlines():
fileout.write(line)
else:
pass
fileopen.close()
fileout.close()
我有问题。我的代码没有运行
答案 0 :(得分:1)
在这一行:
if len(col) > 1 and col[3] in filefin.readlines():
filefin.readlines()
使用list.txt
的所有数据。一旦消耗后续读取将返回一个空字符串,因此第一个之后的所有检查将与空字符串进行比较,通常为False
(除非col[3] == ''
):< / p>
>>> '123' in ''
False
要更正此问题,您可以将list.txt
中的数据缓存到设置对象中,并使用该数据使用in
运算符执行快速查找:
with open('list.txt') as f:
data_list = set(line.rstrip() for line in f)
每行都使用rstrip()
删除了尾随空格,以删除换行符。
然后循环遍历日志文件:
for line in fileopen:
col = line.split(',')
if len(col) > 3 and col[3] in data_list:
fileout.write(line)
我更改了列长检查,以检查数据中是否存在必填字段。
您的代码可以更简洁地重写:
import csv
with open('list.txt') as f:
data_list = set(line.rstrip() for line in f)
with open('file.log') as log_file, open('fileout.txt', 'w') as fileout:
fileout.writelines('{}\n'.format(','.join(row)) for row in csv.reader(log_file) if len(row) > 3 and row[3] in data_list)