0

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

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

这是我的问题:

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

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

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

提前谢谢

4

2 回答 2

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

您的代码中的具体问题在这里:

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])
于 2014-02-06T01:16:59.613 回答
0
  1. 我记不太清csv了,所以我不知道它是否是一个字符串。你遇到了什么错误?在任何情况下,假设它一个字符串,你的行应该是:

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

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

  2. 一个有点老套但简洁的方法是:line[1].split("(")[0]

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

于 2014-02-06T00:32:05.910 回答