【问题标题】:simple python script running very slow (csv file)运行速度很慢的简单 python 脚本(csv 文件)
【发布时间】:2014-03-27 04:38:31
【问题描述】:

我正在运行一个脚本来将一些标题列恢复为 CSV 文件。它将具有标题列的原始文件作为字典,并将它们缝合回丢失标题列的文件中。

问题是它非常慢。这些文件都是中等大小(~50mb),有 200,000 行 x 96 列。目前,当我预览输出文件时,它看起来是正确的。每 10 分钟大小增加约 200kb。

我在编码方面绝对是个菜鸟,所以任何帮助找出脚本为何如此缓慢的帮助将不胜感激。

hapinfile = file('file_with_header_columns', 'r')
hapoutfile = file('file_missing_header_columns.csv', 'r')
o = file('filescombined.txt', 'w')

dictoutfile={}

for line in hapoutfile:
    a=line.rstrip('\n').rstrip('\r').split('\t')
    dictoutfile[a[0]]=a[1:]

hapinfile.close()

for line in hapinfile:
    q=line.rstrip('\n').rstrip('\r').split('\t')
    g=q[0:11]
    for key, value in dictoutfile.items():
        if g[0] == key:
            g.extend(value)
            o.write(str('\t'.join(g)+'\n'))


hapoutfile.close()
o.close()

【问题讨论】:

  • 为什么不使用csv 模块来处理CSV 文件?
  • 如果我理解问题所在,您有两个巨大的 .csv 文件。它们都具有相同的格式,但其中第一行是列名。您想将第二个文件(没有列名)附加到第一个文件。对吗?
  • 但是看起来第二个文件充满了您想要覆盖的数据?不只是一个标题行然后空白?
  • 实际上,您似乎正在对这两个文件进行比较。每当两个文件中都有标头(第一个列)时,您就将第一个文件的数据写入第三个文件。 o.O
  • 您正在将两个文件都读入内存,这不是必需的,您可以逐行浏览文件。

标签: python csv dictionary split strip


【解决方案1】:

由于嵌套的 for 循环一次又一次地在字典中无用地跋涉,这将永远持续下去。试试这个:

for line in hapinfile:
    q=line.rstrip('\n').rstrip('\r').split('\t')
    g=q[0:11]
    if g[0] in dictoutfile:
        g.extend( dictoutfile[g[0]] )
        o.write(str('\t'.join(g)+'\n'))

【讨论】:

    【解决方案2】:

    对于初学者,您不需要第二部分中的内部循环。那是您正在循环的字典,您应该只使用 g[0] 作为键来访问该值。这将为您节省一个巨大的字典循环,该字典发生在无标题文件中的每一行。如果需要,您可以检查 g[0] 是否在字典中以避免 KeyErrors。

    【讨论】:

    • 谢谢,这是问题的根源。
    【解决方案3】:
    from __future__ import with_statement   # if you need it
    
    import csv 
    
    with open('file_with_header_columns', 'r') as hapinfile,
             open('file_missing_header_columns', 'r') as hapoutfile,
             open('filescombined.txt', 'w') as outfile:
        good_data = csv.reader(hapoutfile, delimiter='\t')
        bad_data = csv.reader(hapinfile, delimiter='\t')
        out_data = csv.writer(outfile, delimiter='\t')
        for data_row in good_data:
            for header_row in bad_data:
                if header_row[0] == data_row[0]
                    out_data.writerow(data_row)
                    break   # stop looking through headers
    

    您似乎在这里遇到了一个非常不幸的问题,因为您必须执行嵌套循环才能找到您的数据。如果您可以按标题字段对 CSV 文件进行排序,您可以获得更高的效率。事实上,利用 CSV 模块并压缩所有内容。您可以使用break,虽然在for 循环中有点奇怪,但一旦找到标题,至少会“短路”您搜索第二个文件。

    【讨论】:

      猜你喜欢
      • 2018-01-22
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 2015-11-18
      • 1970-01-01
      相关资源
      最近更新 更多