Python中按列表元素过滤csv内容
我陷入了从一段简单的Python代码中获得正确结果的困境(无论如何,我是Python初学者)。 给定一个csv输入文件(ListInput.csv): pKT,pET,pUT 以及另一个csv文件,其中包含许多这些元素的功能(Table.csv): 。。。。。。。。。。。。等等 我的目标是基于第一个csv文件元素进行选择,以便将csv文件作为输出(WorkingList.txt),在这种情况下,预期结果将是:Python中按列表元素过滤csv内容,python,csv,filter,Python,Csv,Filter,我陷入了从一段简单的Python代码中获得正确结果的困境(无论如何,我是Python初学者)。 给定一个csv输入文件(ListInput.csv): pKT,pET,pUT 以及另一个csv文件,其中包含许多这些元素的功能(Table.csv): 。。。。。。。。。。。。等等 我的目标是基于第一个csv文件元素进行选择,以便将csv文件作为输出(WorkingList.txt),在这种情况下,预期结果将是: pKT,12,GCATACAGGAC,349,, pET,87,GTGACGGTA,5
pKT,12,GCATACAGGAC,349,,
pET,87,GTGACGGTA,506,PPMK,
pUT,54,CCATGTACCTAT,187,PRPTP,
我编写了下面的脚本,它不会给出错误,但最终以一个空文件作为输出。我试着去理解为什么几天来都没有成功。非常感谢您的帮助
#!/usr/bin/python
import csv
v = open('ListInput.csv', 'rt')
csv_v = csv.reader(v)
vt = open('Table.csv', 'rt')
csv_vt = csv.reader(vt)
with open("WorkingList.txt", "a+t") as myfile:
pass
for el in csv_v:
for var in csv_vt:
if el == var[0]:
myfile.write(var)
myfile.close()
第一个问题:
您在第一次迭代时使用输入csv迭代器csv\u vt
。您需要执行以下操作:
vt.seek(0)
为内部循环倒带文件。这留下了一个O(n^2)
搜索算法,但至少它是有效的
第二个问题:
您正在使用块打开和关闭my_文件
。当您到达for
循环时,我的_文件
已经关闭,因为您退出了with
块(这是with
块的保证)
在尝试写入输出时,您是否遇到了与“关闭文件上的操作”交叉的第一个问题
我将用块重写中的最后一部分,并删除close()
第三个问题
不能将列表写入文件,必须先创建csv.writer
对象
总之,您可以通过以下代码解决所有问题以及性能问题:
#!/usr/bin/python
import csv
v = open('ListInput.csv', 'rt')
csv_v = csv.reader(v)
with open('Table.csv', 'rt') as vt:
csv_vt = csv.reader(vt)
# create a dictionary to speed up lookup
# read the table only once
vdict = {var[0]:var for var in csv_vt}
with open("WorkingList.txt", newline="") as myfile: # for Python 3.x
## with open("WorkingList.txt", "wb") as myfile: # for Python 2
cw = csv.writer(myfile)
for el in csv_v:
if el[0] in vdict:
cw.writerow(vdict[el])
v.close()
vdict
是替换内部循环的查找表(仅当“键”是唯一的时有效,这似乎是给定输入样本的情况)第一个问题:
您在第一次迭代时使用输入csv迭代器csv\u vt
。您需要执行以下操作:
vt.seek(0)
为内部循环倒带文件。这留下了一个O(n^2)
搜索算法,但至少它是有效的
第二个问题:
您正在使用
块打开和关闭my_文件
。当您到达for
循环时,我的_文件
已经关闭,因为您退出了with
块(这是with
块的保证)
在尝试写入输出时,您是否遇到了与“关闭文件上的操作”交叉的第一个问题
我将用块重写中的最后一部分,并删除close()
第三个问题
不能将列表写入文件,必须先创建csv.writer
对象
总之,您可以通过以下代码解决所有问题以及性能问题:
#!/usr/bin/python
import csv
v = open('ListInput.csv', 'rt')
csv_v = csv.reader(v)
with open('Table.csv', 'rt') as vt:
csv_vt = csv.reader(vt)
# create a dictionary to speed up lookup
# read the table only once
vdict = {var[0]:var for var in csv_vt}
with open("WorkingList.txt", newline="") as myfile: # for Python 3.x
## with open("WorkingList.txt", "wb") as myfile: # for Python 2
cw = csv.writer(myfile)
for el in csv_v:
if el[0] in vdict:
cw.writerow(vdict[el])
v.close()
vdict
是替换内部循环的查找表(仅当“键”是唯一的时有效,这似乎是给定输入样本的情况)已解决!下面是一段有效的代码:
import csv
with open('ListInput.csv', 'rt') as csvfile:
readCSV = csv.reader(csvfile, delimiter=',')
vinput = []
flist = []
for row in readCSV:
vi = row
vinput.append(vi)
print(vinput)
with open('Table.csv', 'rt') as csvfile:
readTable = csv.reader(csvfile, delimiter=',')
vtable = []
for row in readTable:
vt = row
for rig in vi:
el = rig
if str(el) in vt:
vtable.append(vt)
print(vtable)
with open (r'WorkingTable.csv', 'w', newline='') as write_file:
write=csv.writer(write_file)
write.writerows([r] for r in vtable)
解决了!下面是一段有效的代码:
import csv
with open('ListInput.csv', 'rt') as csvfile:
readCSV = csv.reader(csvfile, delimiter=',')
vinput = []
flist = []
for row in readCSV:
vi = row
vinput.append(vi)
print(vinput)
with open('Table.csv', 'rt') as csvfile:
readTable = csv.reader(csvfile, delimiter=',')
vtable = []
for row in readTable:
vt = row
for rig in vi:
el = rig
if str(el) in vt:
vtable.append(vt)
print(vtable)
with open (r'WorkingTable.csv', 'w', newline='') as write_file:
write=csv.writer(write_file)
write.writerows([r] for r in vtable)
此代码不起作用。我真的很感激你的帮助。现在,我将尝试找到另一种成功解决此问题的方法。此代码不起作用。我真的很感激你的帮助。现在,我将尝试找到一种不同的成功方法来解决这个问题。