我是第二年的EE学生。 我刚刚开始为我的项目学习python。
我打算用类似
的格式解析csv文件3520005,"Toronto (Ont.)",C ,F,2503281,2481494,F,F,0.9,1040597,979330,630.1763,3972.4,1
2466023,"Montréal (Que.)",V ,F,1620693,1583590,T,F,2.3,787060,743204,365.1303,4438.7,2
5915022,"Vancouver (B.C.)",CY ,F,578041,545671,F,F,5.9,273804,253212,114.7133,5039.0,8
3519038,"Richmond Hill (Ont.)",T ,F,162704,132030,F,F,23.2,53028,51000,100.8917,1612.7,28
进入如下文本文件
多伦多2503281 蒙特利尔1620693 温哥华578041
我正在提取第1和第5列并将其保存到文本文件中。
这是我到目前为止所做的。
import csv
file = open('raw.csv')
reader = csv.reader(file)
f = open('NicelyDone.text','w')
for line in reader:
f.write("%s %s"%line[1],%line[5])
这对我不起作用,我能够从csv文件中提取数据为行[1],行[5]。 (我能打印出来) 但我不知道如何以我想要的格式将它写入.text文件。
另外,我必须处理第一列,例如“Toronto(Ont。)”到“Toronto”。 我熟悉函数find(),我假设我可以使用“(”作为停止字符,从多伦多(Ont。)中提取多伦多, 但根据我的研究,我不知道如何使用它,并要求它返回我的字符串(多伦多)。
这是我的问题:
line[1]
的数据格式是什么?
f.write()
怎么办?Toronto
或其他方法从Toronto(Ont)
中将单词find()
提取为字符串形式。我的想法是,我可以像c = a+ ' ' + b
一样将这两个字符串添加到一起,这样就可以获得我想要的格式。
所以我可以使用f.write()
写入文件:)
很抱歉,如果我的问题听起来太容易或太愚蠢。
提前致谢
振
答案 0 :(得分:1)
csv.reader
获取的所有数据均为字符串。对此有各种各样的解决方案,但最简单的方法是拆分(
并删除任何空格:
>>> a = 'Toronto (Ont.)'
>>> b = a.split('(')
>>> b
Out[16]: ['Toronto ', 'Ont.)']
>>> c = b[0]
>>> c
Out[18]: 'Toronto '
>>> c.strip()
Out[19]: 'Toronto'
或一行:
>>> print 'Toronto (Ont.)'.split('(')[0].strip()
另一种选择是使用正则表达式(re module)。
代码中的具体问题在于:
f.write("%s %s"%line[1],%line[5])
使用%
语法格式化字符串,您必须提供单个值或可迭代。在你的情况下,这应该是:
f.write("%s %s" % (line[1], line[5]))
另一种完全相同的方法是使用format
方法。
f.write('{} {}'.format(line[1], line[5]))
这是一种形成字符串的灵活方式,我建议您在docs中阅读。
关于你的代码,你应该考虑几件事。
始终记得关闭文件处理程序。如果您使用with open(...) as fp
,则会为您解决此问题。
with open('myfile.txt') as ifile:
# Do stuff
# The file is closed here
请勿使用保留字作为变量名。 file
是这样的事情,并且通过将其用作其他内容( shadowing 它),您可能会在以后的代码中引起问题。
要编写数据,您可以使用csv.writer:
with open('myfile.txt', 'wb') as ofile:
writer = csv.writer(ofile)
writer.writerow(['my', 'data'])
从Python 2.6及更高版本中,您可以在一个语句中组合多个with
语句:
with open('raw.csv') as ifile, open('NicelyDone.text','w') as ofile:
reader = csv.reader(ifile)
writer = csv.writer(ofile)
结合这些知识,您的脚本可以重写为:
import csv
with open('raw.csv') as ifile, open('NicelyDone.text', 'wb') as ofile:
reader = csv.reader(ifile)
writer = csv.writer(ofile, delimiter=' ')
for row in reader:
city, num = row[1].split('(')[0].strip(), row[5]
writer.writerow([city, num])
答案 1 :(得分:0)
我不记得csv
那么好,所以我不知道它是不是字符串。你遇到了什么错误?在任何情况下,假设它是一个字符串,你的行应该是:
f.write("%s %s " % (line[1], line[5]))
换句话说,您需要一组括号。此外,您的字符串中应该有一个尾随空格。
执行此操作的有点hackish但简洁的方法是:line[1].split("(")[0]
这将创建一个在(
符号上拆分的列表,然后提取第一个元素。