Python通过过滤现有csv-fi中的选定行来编写新的csv文件

2024-04-26 06:44:12 发布

您现在位置:Python中文网/ 问答频道 /正文

只是一个问题,我试图将选定的行从.csv文件写入新的.csv文件,但出现了一个错误。在

在测试.csv我试图读取的文件如下(两列):

2013-9     1
2013-10    2
2013-11    3
2013-12    4
2014-1     5
2014-2     6
2014-3     7
2014-4     8
2014-5     9

因为我只想要2014年,所以我的代码是:

^{pr2}$

但是,错误是: AttributeError:“str”对象没有属性“has \u key”

不知道这个程序的正确方法,请帮助我谁是一个新的python用户 谢谢


Tags: 文件csv对象方法key代码用户程序
3条回答

使用string.find或正则表达式在字符串中查找子字符串。在

所以不是

if (rad_line.has_key('2014')):

您可以:

^{pr2}$

既然您无论如何都在使用csv模块,为什么不在读取时写入该文件:

import csv

with open('in.csv', 'r') as i, open('out.csv', 'w') as o:
   r = csv.reader(i, delimiter='\t')
   w = csv.writer(o, delimiter='\t')
   for row in r:
      if row[0].split('-')[0] == '2014':
          w.write(row)

可以通过将has_key改为{}来“修复”这个错误,但更重要的是,程序当前的编写方式,您将跳过从2014开始的第一行,并包含从2013开始的后续组的第一行。这真的是你想要的吗?在

如果您只想保留从2014年开始的所有行,那么:

with open('year.csv') as rad_file, open("try.csv","w") as out_file:
    header = next(rad_file)
    out_file.write(header)
    for rad_line in rad_file:
        if rad_line.startswith('2014'):
            out_file.write(rad_line)

通过在读取时处理每一行,可以避免在列表string_storage中累积行,从而节省内存。这在处理大文件时非常重要。在


另外,如果使用^{}打开文件,则当执行流离开with语句时,该文件将自动关闭。在


注意,在Python2中,dicts有一个has_key方法来检查dict是否有特定的键。在

代码引发错误,因为rad_line是字符串而不是dict

在Python3中,has_key方法被移除。在Python2的现代版本中,比如Python2.7,您永远不需要使用has_key,因为key in dict比{}更受欢迎。在

相关问题 更多 >