将文本文件解析为Python列表

4

我完全不了解Python,我正在尝试读取一个包含单词和数字组合的txt文件。我可以成功读取txt文件,但是我很难将字符串转换为可处理的格式。

import matplotlib.pyplot as plt
import numpy as np
from numpy import loadtxt

f= open("/Users/Jennifer/Desktop/test.txt", "r")

lines=f.readlines()

Data = []

list=lines[3]
i=4
while i<12:
        list=list.append(line[i])
        i=i+1

print list

f.close()

我想要一个包含第3到12行(从0开始)中所有数字元素的列表。当我使用print lines[1]时,我会得到该行的数据。当我使用print lines或print lines[3:12]时,我得到每个字符前面带有\x00。例如,单词“Plate”变成:['\x00P\x00l\x00a\x00t\x00e。使用lines = [line.strip() for line in f]也得到相同结果。当我尝试在循环中将各行组合在一起时,我会收到错误消息“AttributeError: 'str' object has no attribute 'append'。”
如何将txt文件中的选定行放入列表中?非常感谢!!!
编辑:txt文件的格式如下:

BLOCKS= 1 板:磷酸盐噪声测定2000x 1.3 板格式终点吸光度原始值FALSE 1 1 650 1 12 96 1 8
温度(℃) 1 2 3 4 5 6 7 8 9 10 11 12
21.4 0.4977 0.5074 0.5183 0.5128 0.5021 0.5114 0.4993 0.5308 0.4837 0.5286 0.5231 0.5227
0.488 0.4742 0.5011 0.4868 0.4976 0.4845 0.4848 0.5179 0.4772 0.5363 0.5109 0.5197
0.4882 0.4913 0.4941 0.5188 0.4766 0.4914 0.495 0.5172 0.4826 0.5039 0.504 0.5451
0.4771 0.4875 0.523 0.4851 0.4757 0.4767 0.4918 0.5212 0.4742 0.5153 0.5027 0.5235
0.4474 0.4841 0.5193 0.4755 0.4649 0.4883 0.5165 0.5223 0.4799 0.5269 0.5091 0.5191
0.4721 0.4794 0.501 0.4467 0.4785 0.4792 0.4894 0.511 0.4778 0.5223 0.4888 0.5273
0.4122 0.4454 0.314 0.2747 0.4621 0.4416 0.3716 0.2534 0.4497 0.5778 0.2319 0.1038
0.4479 0.5368 0.3046 0.3115 0.4745 0.5116 0.3689 0.3915 0.4803 0.5209 0.1981 0.1062

~结束 原始文件名:2013-08-06 磷噪声;最后保存日期:2013年8月6日下午7:00:55

更新 我使用了这段代码:

f= open("/Users/Jennifer/Desktop/test.txt", "r")
file_list = f.readlines()

first_twelve = file_list[3:11]

data = [x.replace('\t',' ') for x in first_twelve]
data = [x.replace('\x00','') for x in data]
data = [x.replace(' \r\n','') for x in data]

print data

要得到这个结果:

[' 21.4 0.4977 0.5074 0.5183 0.5128 0.5021 0.5114 0.4993 0.5308 0.4837 0.5286 0.5231 0.5227 ', ' 0.488 0.4742 0.5011 0.4868 0.4976 0.4845 0.4848 0.5179 0.4772 0.5363 0.5109 0.5197 ', ' 0.4882 0.4913 0.4941 0.5188 0.4766 0.4914 0.495 0.5172 0.4826 0.5039 0.504 0.5451 ', ' 0.4771 0.4875 0.523 0.4851 0.4757 0.4767 0.4918 0.5212 0.4742 0.5153 0.5027 0.5235 ', ' 0.4474 0.4841 0.5193 0.4755 0.4649 0.4883 0.5165 0.5223 0.4799 0.5269 0.5091 0.5191 ', ' 0.4721 0.4794 0.501 0.4467 0.4785 0.4792 0.4894 0.511 0.4778 0.5223 0.4888 0.5273 ', ' 0.4122 0.4454 0.314 0.2747 0.4621 0.4416 0.3716 0.2534 0.4497 0.5778 0.2319 0.1038 ', ' 0.4479 0.5368 0.3046 0.3115 0.4745 0.5116 0.3689 0.3915 0.4803 0.5209 0.1981 0.1062 ']

如果我没记错的话,这是一个列表的列表,我应该可以处理它。非常感谢所有回答我的人!!!


2
不要使用“list”作为变量名 >:-( - dawg
2
如果您能提供文件的样本,我们可以更好地帮助您。 - elyase
抱歉!以后不会再这样做了。 - Rachel Rose
Elyase - 我已将其包含在上面的编辑中。我也是 Stack Overflow 的新手,有更好的包含方式吗? - Rachel Rose
4个回答

6
当你写下代码lines = f.readlines()时,会返回一个行列表。当你接着写lines[3]时,你会得到第三行的内容。这就是为什么你最终得到了单个字符。
你需要做的只是:
files = open("Your File.txt")

file_list =  files.readlines()

first_twelve = file_list[0:12] #returns a list with the first 12 lines

一旦你得到了first_twelve数组,你可以随意使用它。

要打印每一行,你需要这样做:

for each_line in first_twelve:
    print each_line

那应该适合您的需求。


非常感谢你,彼得!然而,当我打印first_twelve时,我仍然按字符获取它(在for循环中打印每行都很好)。我想我可能只是误解了Python在这里的工作方式...数组是字符数组还是数字数组? - Rachel Rose
你的 .txt 文件没有用 \n 分隔吗? - Peter Foti

2
您的源代码中有一行list=lines[3]
这里存在两个问题:
1. 不要使用list作为变量名。这样做会默默地覆盖内置的列表构造函数。 2. 当您从列表中取出一个项目lines[3]时,现在您只有该对象——在本例中是字符串。当您尝试追加到它时,您无法这样做——它不是一个列表。
您可以在控制台中轻松演示您的错误:
>>> li=['1']
>>> li.append('2')
>>> li
['1', '2']
>>> st='1'
>>> st.append('2')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'append'

其他评论,总的来说,关于你的代码。
假设你有一个名为“/tmp/test/txt”的文本文件,其中包含以下文本:
Line 1
Line 2
...
Line 19

读取该文件的内容就像这样简单:
with open('/tmp/test.txt', 'r') as fin:
    lines=fin.readlines()

如果您只想要一部分行,可以使用切片:
subset=lines[3:12]

如果你想对每一行进行处理,比如去除回车符,请将文件对象作为迭代器使用:
with open('/tmp/test.txt', 'r') as fin:
    lines=[]
    for line in fin:
        lines.append(line.strip()) 

针对您所提到的数据中存在NUL字符的问题,也许您正在读取一个伪装成文本的二进制文件?您需要发布一个文件示例。

编辑

您的文件包含Unicode字符。(就在“Temperature”之后) 这可能是您看到的一些奇怪字符。如果您只对具有数字的行感兴趣,则可以忽略它们。

您还没有一个列表的列表,但很容易获得:

data=[]                               # will hold the lines of the file
with open(ur_file,'rU') as fin:       
    for line in fin:                  # for each line of the file
        line=line.strip()             # remove CR/LF
        if line:                      # skip blank lines
            data.append(line)

print data                            # list of STRINGS separated by spaces
matrix=[map(float,line.split()) for line in data[3:10]]  # convert the strings..
print matrix                          # NOW you have a list of list of floats...

非常感谢你,Drewk!我真的很感激你对代码的一般性评论,这对我帮助很大。如果可以的话,你能否看一下我上面发布的内容,并告诉我那是否更好?谢谢!! - Rachel Rose

1
下面的调整可能有助于消除嵌入在您的数据中的\00字符。
f = open("/Users/Jennifer/Desktop/test.text", "r")

lines = f.readlines()
lines = [x.replace('\x00','') for x in lines]

for i in range(3,12):
    l = []
    l.append(lines[i])

我不确定您的数据是否有其他分隔符(比如逗号或空格)来分隔数字。如果有,简单的拆分操作可以将该行转换为列表:

line = '123.00,456.00,789.00'

l = line.split(',')  # list will become ['123.00','456.00','789.00']

编辑

继续使用Rachel更新的代码:

f= open("/Users/Jennifer/Desktop/test.txt", "r")
file_list = f.readlines()

first_twelve = file_list[3:11]

data = [x.replace('\t',' ') for x in first_twelve]
data = [x.replace('\x00','') for x in data]
data = [x.replace(' \r\n','') for x in data]

items = []
for dataline in data:
    items += dataline.split(' ')
items = [float(x) for x in items if len(x) > 0]  # remove dummy items left in the list

print items

非常感谢你,Toruk!我用这个创建了一个列表的列表(我想),我应该能够使用它,谢谢! - Rachel Rose

0

readLines() 的内存效率不高。它会将整个文件读入内存中。 相反,可以这样做:

[i.split() for i in open('filename.txt')]

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