使用python在其他文件中包含值的数据列

时间:2017-09-29 11:30:43

标签: python

我有数据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()

我有问题。我的代码没有运行

1 个答案:

答案 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)