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

时间:2014-09-05 13:44:18

标签: python python-2.7

只是一个问题,我试图将.csv文件中的选定行写入新的.csv文件,但是有错误。

我试图读取的test.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年,这是我的代码:

import re
import csv

write_flag=0
string_storage=[]
rad_file=open('year.csv')

for rad_line in rad_file:
        if write_flag==1:
                string_storage.append(rad_line)
        if (rad_line.has_key('2014')):
                write_flag=1
        if (rad_line.has_key('2013')):
                write_flag=0
rad_file.close()

out_file = open("try.csv","w")
for temp_string in string_storage:
    out_file.write(temp_string)
out_file.close()

然而,错误是: AttributeError:'str'对象没有属性'has_key'

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

3 个答案:

答案 0 :(得分:3)

由于您仍在使用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)

答案 1 :(得分:2)

错误可以通过将has_key更改为startswith来“修复”,但更重要的是,当前编写程序的方式,您将跳过从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-statement打开文件,那么当执行流程离开with语句时,文件将自动关闭。


请注意,在Python2中,dicts使用has_key方法检查dict是否具有某个键。

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

在Python3中删除了has_key方法。在现代版本的Python2(如Python2.7)中,您永远不需要使用has_key,因为key in dict优先于dict.has_key(key)

答案 2 :(得分:1)

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

所以而不是

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

你可以这样做:

if (rad_line.find('2014') <> -1):