【问题标题】:Python - Search a list of strings from a text file in a large .csv filePython - 从大型 .csv 文件中的文本文件中搜索字符串列表
【发布时间】:2020-12-21 17:47:21
【问题描述】:

抱歉,因为我可能在这里犯了一大堆错误,但我正在尝试使用文件 (justgenes.txt) 中的字符串列表对一个大型 CSV 文件进行搜索,并返回以字符串为特色的行justgenes 列表。

我主要使用 BASH,但我的代码占用了超过 100GB 的内存并且崩溃了:

grep -f justgenes.txt allDandHunique.csv > HPCgenesandbugs.csv

因此,我尝试在 python 中执行此操作,假设它会更高效,但我对此知之甚少。

我使用这段代码(我从网上获取的),但最后得到一个空文件:

data = open('allDandHunique.csv')
                
with open('justgenes.txt', "r+") as file1:
    fileline1= file1.readlines()
    for x in data: # <--- Loop through the list to check      
        for line in fileline1: # <--- Loop through each line
            if x in line:
                 print(x)

justgenes 文件如下所示:

1A0N_B
1A1A_A
1A4I_A
1A5Y_A
1ACO_A
1AGN_A
1AGS_A
1AJE_A
1AJJ_A
1AP0_A
1APQ_A

虽然 csv 看起来像这样:

"0403181A:PDB=1BP2,2BPP",
"0403181A:PDB=1BP2,2BPP",,,
"0706243A:PDB=1HOE,2AIT,3AIT,4AIT",
"0706243A:PDB=1HOE,2AIT,3AIT,4AIT",,,
"1309311A:PDB=1EMD,2CMD",
"1309311A:PDB=1EMD,2CMD",,,
"1513188A:PDB=1BBC,1POD",
"1513188A:PDB=1BBC,1POD",,,
0308206A,
0308206A,,,
0308221A,
0308221A,,,
0308230A,
0308230A,,,

如有任何帮助,我们将不胜感激。

【问题讨论】:

  • 我希望搜索 csv 中的所有列
  • 好的,请稍等
  • 如果您添加了匹配行的示例以及您想要输出的内容,将会有所帮助。你的 justgenes.txt 有多大?你的 allDandHunique.csv 有多大?当其中一个字符串(例如 1A1A_A)与列完全匹配时,您想匹配该行还是它可以是列的子字符串?如果有匹配项,您是要输出整行,还是只输出行的一部分?
  • 所以,我想要任何包含整个字符串的行(例如 1A1A_A)在该行的任何位置。输出应该是包含列表中字符串的每一(整)行。输出示例将是“1513188A:PDB=1BBC,1A1A_A”,我知道在示例数据中不可见。 justgenes.txt 文件有 1,866,642 行,allDandHunique.csv 有 5,610,939 行。

标签: python string search design-patterns grep


【解决方案1】:

由于我没有这些文件,我无法自己测试它,但我认为这段代码可能会有所帮助。

data = open('allDandHunique.csv')
        
for x in data: # <--- Loop through the list to check      
    with open('justgenes.txt', "r+") as file1:
        fileline1= file1.readlines()
        for line in fileline1: # <--- Loop through each line
            if x in line:
                    print(x)

对于每个x in data,您必须遍历file1 中的所有行。如果我没记错的话,你需要为每次迭代打开你的文件,否则,当你到达 EOF 时,它什么也不返回。

【讨论】:

    【解决方案2】:

    我会使用 pandas 来完成这项工作。

    尝试类似:

    import pandas as pd
    
    df = pd.read_csv('allDandHunique.csv')
    
    with open('justgenes.txt', "r+") as file1:
        fileline1= file1.readlines()
        for x in fileline1: 
          for col in df:
             if col.str.contains(x, regex=False):
                 ##do something here##
    

    如果在读取文件时得到一个空白文件,我会检查并确保路径正确。

    【讨论】:

    • 那么我的评论不再适用;-)
    【解决方案3】:
    import csv
    
    with open('justGenes') as infile:
        searchTargets = set(line.strip() for line in infile)
    
    
    with open('allDandHunique.csv') as infile:
        for row in csv.reader(infile):
            if any(target in row for target in searchTargets):
                print(row)
    

    【讨论】:

    • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 2012-09-09
    • 2013-04-27
    • 2013-12-06
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多