只是一个问题,我试图将.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用户 感谢
答案 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):