Python中按列表元素过滤csv内容

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

我陷入了从一段简单的Python代码中获得正确结果的困境(无论如何,我是Python初学者)。 给定一个csv输入文件(ListInput.csv): pKT,pET,pUT

以及另一个csv文件,其中包含许多这些元素的功能(Table.csv):

。。。。。。。。。。。。等等

我的目标是基于第一个csv文件元素进行选择,以便将csv文件作为输出(WorkingList.txt),在这种情况下,预期结果将是:

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)

此代码不起作用。我真的很感激你的帮助。现在,我将尝试找到另一种成功解决此问题的方法。此代码不起作用。我真的很感激你的帮助。现在,我将尝试找到一种不同的成功方法来解决这个问题。