【问题标题】:csv content filtering by list elments in Python在Python中按列表元素过滤csv内容
【发布时间】:2016-12-05 16:06:07
【问题描述】:

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

以及另一个包含许多这些元素的特征的 csv 文件 (Table.csv):

pBR,156,AATGGT,673,HHHTTTT,
pUT,54,CCATGTACCTAT,187,PRPTP,
pHTM,164,GGTATAG,971,WYT,
pKT,12,GCATACAGGAC,349,,
pET,87,GTGACGGTA,506,PPMK,

............等等

我的目标是根据第一个 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()

【问题讨论】:

    标签: python csv filter


    【解决方案1】:

    第一个问题:

    您在第一次迭代时使用了输入 csv 迭代器 csv_vt。你需要做的:

    vt.seek(0)
    

    为内部循环倒回文件。这留下了 O(n^2) 搜索算法,但至少它有效。

    第二个问题:

    您在 with 块中打开和关闭 my_file。当你到达你的for 循环时,my_file 已经关闭,因为你走出了with 块(这是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 是替换您的内部循环的查找表(仅在“键”是唯一的情况下才有效,考虑到您的输入样本似乎就是这种情况)

    【讨论】:

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

    解决了!这是一段有效的代码:

    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)
    

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多