将csv文件解析为文本文件

时间:2014-02-06 00:20:35

标签: python c parsing csv find-all-references

我是第二年的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。)中提取多伦多, 但根据我的研究,我不知道如何使用它,并要求它返回我的字符串(多伦多)。

这是我的问题:

  1. line[1]的数据格式是什么?
    • 如果是字符串,f.write()怎么办?
    • 如果它不是字符串,我该如何将其转换为字符串?
  2. 如何使用Toronto或其他方法从Toronto(Ont)中将单词find()提取为字符串形式。
  3. 我的想法是,我可以像c = a+ ' ' + b一样将这两个字符串添加到一起,这样就可以获得我想要的格式。 所以我可以使用f.write()写入文件:)

    很抱歉,如果我的问题听起来太容易或太愚蠢。

    提前致谢

2 个答案:

答案 0 :(得分:1)

  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 module)。

  3. 代码中的具体问题在于:

    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)

  1. 我不记得csv那么好,所以我不知道它是不是字符串。你遇到了什么错误?在任何情况下,假设它一个字符串,你的行应该是:

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

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

  2. 执行此操作的有点hackish但简洁的方法是:line[1].split("(")[0]

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