我有一个带有一些数据的文件file.csv:
fn,ln,tel
john,doe,023322
jul,dap,024322
jab,sac,0485
我想有一个我可以这样访问的数组:
file = 'file.csv'
with open(file,'rU') as f:
reader = csv.DictReader(f)
print reader[0].fn
所以我希望它从第一条记录中打印出第一个名字。不幸的是,我收到了这个错误:
ValueError: I/O operation on closed file
我怎样才能完成它,以便我不需要保持文件打开并且我可以使用我的数组。顺便说一句,我不需要在csv文件中回写,我只需要使用数据,为此,我可以修改的数组最好。
答案 0 :(得分:4)
您需要在with
区块内访问阅读器*,而不是在其外部:
file = 'file.csv'
with open(file,'rU') as f:
reader = csv.DictReader(f)
first_row = next(reader)
print first_row['fn']
只要在代码块之外移动代码,f
文件对象就会关闭,您就无法再从阅读器中获取行。这是with
陈述的重点。
如果您想随机访问文件中的所有行,请先将阅读器转换为列表:
file = 'file.csv'
with open(file,'rU') as f:
reader = csv.DictReader(f)
all_rows = list(reader)
print all_rows[0]['fn']
list()
调用将遍历reader
,将每个结果添加到列表对象,直到读取所有行。确保你有足够的内存来容纳所有这些行。