如何在Python中将文本文件转换为列表

10

我遇到了一些问题,想将一个文本文件转换成由逗号分隔的列表组成的列表。基本上,我需要:

DATE  OF OCCURRENCE,WARD,LONGITUDE,LATITUDE
06/04/2011,3,-87.61619704286184,41.82254380664193
06/04/2011,20,-87.62391924557963,41.79367531770095

看起来像:

[["DATE  OF OCCURRENCE", "WARD", "LONGITUDE" , "LATITUDE"],
 ["06/04/2011", "3", "-87.61619704286184", "41.82254380664193"],
 ["06/04/2011", "20", "-87.62391924557963", "41.79367531770095"]]

这是我目前的代码:

row = []
crimefile = open(fileName, 'r')
for line in crimefile.readlines():
    row.append([line])
    for i in line.split(","):
        row[-1].append(i)

然而,这给我带来了以下结果:

[['DATE  OF OCCURRENCE,WARD,LONGITUDE,LATITUDE\n', 'DATE  OF OCCURRENCE', 'WARD', 'LONGITUDE', 'LATITUDE\n'], 
['06/04/2011,3,-87.61619704286184,41.82254380664193\n', '06/04/2011', '3', '-87.61619704286184', '41.82254380664193\n'], 
['06/04/2011,20,-87.62391924557963,41.79367531770095', '06/04/2011', '20', '-87.62391924557963', '41.79367531770095']]

我只想能够删除第一部分并用第二部分替换它。我该怎么做?

4个回答

32

也许:

crimefile = open(fileName, 'r')
yourResult = [line.split(',') for line in crimefile.readlines()]

3
这个简单的例子可以使用这种方式处理,但是针对像这样的数据文件,请学习csv模块。当您开始读取包含逗号的带引号字符串字段时,您会感到高兴。(split()不够智能,无法区分哪些逗号是分隔符,哪些属于带引号的字符串内部。) 这个只包含数字的数据集没有问题,但如果您从一开始就学习好的实践,以后就不必去纠正错误的方法了。另外,还要查看csv.DictReader类 - 它将使用文件的第一行作为键名,并为每一行提供一个dict而不仅仅是一个列表。 - PaulMcG
3
@michael:如果你删除.readlines(),会更好,因为它是(1)没有必要的,(2)什么也没用就占用了内存。实际上,你可以简单地使用[… for line in crimeFile],Python将简单地迭代文件的每一行并几乎不使用任何内存,而不是使用readlines()将整个文件读入内存并将所有行放入列表中(这将占用内存)。 - Eric O. Lebigot
@michael:这个版本保留了最后一行项目中的换行符,这可能不太方便。 - Eric O. Lebigot

15

这看起来像是一个CSV文件,因此您可以使用Python csv模块来读取它。例如:

import csv

crimefile = open(fileName, 'r')
reader = csv.reader(crimefile)
allRows = [row for row in reader]

使用csv模块可以指定如何处理引号和换行等内容。请参阅我上面链接的文档。


我查看了文档和上面的代码,但仍然有点不清楚。你的代码中第三行到底是做什么的? - LiamNeesonFan
第三行是一个Python 列表推导式reader类可以用作可迭代对象,因此您可以迭代csv文件中的每一行。每一行实际上都是一个包含csv文件每个列的一个值的列表。因此,代码的第三行只是说:创建一个包含reader可迭代对象的每一行的列表。每一行本身都是一个值的列表,因此最终结果是allRows是一个列表的列表,就像您想要的那样。 - srgerg
2
@srgergпјҡдёҠйқўзҡ„д»Јз ҒеҰӮжһңдҪҝз”ЁallRows = list(reader)дјҡжӣҙеҘҪпјҢиҝҷдёӘж–№жі•еҸҜд»ҘеҸ–д»ЈжӣҙеӨҚжқӮзҡ„еҲ—иЎЁжҺЁеҜјејҸallRows = [row for row in reader]гҖӮ - Eric O. Lebigot

3

我认为@michael的评论可能有点过时了。由于我遇到了这个问题,而且似乎仍然相关,所以我想提供一个更加现代化的解决方案,基于之前的回答,大致如下:

with open(file_name, 'r') as f:
    your_result = [line.split(',') for line in f.read().splitlines()]

1

继续你已经开始的:

row = [[]] 
crimefile = open(fileName, 'r') 
for line in crimefile.readlines(): 
    tmp = []
    for element in line[0:-1].split(','):
        tmp.append(element)
row.append(tmp)

for line in crimefile:比写for line in crimefile.readlines()更高效和清晰,后者会消耗不必要的内存。 - Eric O. Lebigot
另外,line[0:-1]在Windows上不能正常工作,因为Windows使用两个字节来表示换行符。您需要以rU模式打开文件,将换行符转换为\n - Eric O. Lebigot
在你的第一条评论中 - 我知道这一点,我只是扩展了他的代码。在你的第二条评论中,line[0:-1] 在我使用的 Windows 平台上和 Python 2.7.2 版本上运行良好。 - Peter Donegan
错误可能有点微妙,很难发现(例如,序列 Hello\r\r\n 在打印时看起来正常)。在 row.append() 之后,print tmp[-1], len(tmp[-1]) 的结果是否如预期? - Eric O. Lebigot
f = open('eol.txt','r') total = [] for l in f: ... total.append(l) ... total ['test\n'] t= total[0][0:-1] t 'test' print t[-1] t print len(t[-1]) 1
- Peter Donegan
好的。在Python中,默认的文本模式将输入文件中的\r\n序列转换为\n。根据文档:“默认情况下使用文本模式,它可能在写入时将'\n'字符转换为特定于平台的表示形式,并在读取时进行反向转换。”(强调是我的)。我删除了我的-1并换成了+1。虽然这样写更常见:line[:-1]而不是line[0:-1] :) - Eric O. Lebigot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接