繁体   English   中英

将CSV文件解析为文本文件

[英]parse a csv file into a text file

我是第二年的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

我提取第一列和第五列并将其保存到文本文件中。

这是我到目前为止所拥有的。

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文件中的数据提取为line [1],line [5]。 (我可以将其打印出来),但是我不知道如何将其以所需的格式写入.text文件。

另外,我必须将第一列,例如“多伦多(安大略省)”处理为“多伦多”。 我对find()函数很熟悉,我假设我可以使用“(”作为停止字符从Toronto(Ont。)提取Toronto,但是根据我的研究,我不知道如何使用它并提出要求还给我字符串(多伦多)。

这是我的问题:

  1. line[1]的数据格式是什么?
    • 如果是字符串,为什么f.write()不起作用?
    • 如果不是字符串,如何将其转换为字符串?
  2. 我如何使用find()或其他方法将Toronto以外的Toronto(Ont)单词提取为字符串形式。

我的想法是,我可以将这两个字符串加在一起,例如c = a+ ' ' + b ,这将给我我想要的格式。 所以我可以使用f.write()写入文件:)

对不起,如果我的问题听起来太简单或愚蠢。

提前谢谢

  1. 您从csv.reader读取的所有数据都是字符串。
  2. 有多种解决方案,但最简单的方法是分割(并删除任何空白:

     >>> 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模块 )。

您的代码中的特定问题位于:

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就是这样,通过将它用作其他东西( 遮盖它),稍后可能会在代码中引起问题。

  • 要写入数据,可以使用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. 我不太记得csv ,所以我不知道它是否是字符串。 你遇到了什么错误? 无论如何,假设它字符串,则您的行应为:

     f.write("%s %s " % (line[1], line[5])) 

    换句话说,您需要一组括号。 另外,您的字符串中应包含一个尾随空格。

  2. 一种有点骇人但简洁的方法是: line[1].split("(")[0]

    这将创建一个在(符号上分割的列表,然后提取第一个元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM