将csv文件解析为文本fi

2024-06-17 16:32:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我是电子工程二年级的学生。 我刚开始为我的项目学习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列并将其保存到文本文件中。在

这就是我目前所拥有的。在

^{pr2}$

这对我不起作用,我可以从csv文件中提取数据,行[1],行[5]。(我可以打印出来) 但我不知道如何以我想要的格式将它写入.text文件。在

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

我的问题是:

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

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

抱歉,如果我的问题听起来太简单或愚蠢。在

谢谢


Tags: 文件csv项目字符串格式电子工程find
2条回答
  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'
    

    或者在一行中:

    ^{pr2}$

    另一个选择是使用正则表达式(re module)。

代码中的具体问题如下:

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

使用%语法格式化字符串,必须提供单个值或iterable。在您的情况下,这应该是:

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

另一种完全相同的方法是使用^{}方法。在

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就是这样一个东西,如果将其用作其他东西(隐藏it),您可能会在以后的代码中引起问题。

  • 要写入数据,可以使用csv.writer

    with open('myfile.txt', 'wb') as ofile:
        writer = csv.writer(ofile)
        writer.writerow(['my', 'data'])
    
  • 在Python2.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]

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

相关问题 更多 >