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 开始)中的所有元素的列表,这些元素都是数字。当我打印行 [1] 时,我从该行获取数据。当我打印行或打印行[3:12] 时,我得到的每个字符都以 \x00 开头。例如,单词“Plate”变成:['\x00P\x00l\x00a\x00t\x00e。使用 lines = [line.strip() for line in f] 得到相同的结果。当我尝试在上面的 while 循环中将各个行放在一起时,我收到错误“AttributeError:'str' object has no attribute 'append'。”

如何从 txt 文件中选择行到列表中?太感谢了!!!

编辑: txt 文件如下所示:

BLOCKS= 1 Plate: Phosphate Noisiness Assay 2000x 1.3 PlateFormat Endpoint Absorbance Raw FALSE 1 1 650 1 12 96 1 8
Temperature(¡C) 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

~End 原始文件名: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

to get this result: [' 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.4479 0.5368 0.3046 0.3115 0.4745 0.4745 0.5116 0.5116 0.3689 0.3689 0.3915 0.4803 0.4803 0.55003 0.1981

这是(如果我错了,请纠正我,对 Python 非常陌生!)我应该能够使用的列表列表。非常感谢所有回复的人!!!

4

4 回答 4

6

当您编写代码时lines = f.readlines(),将向您返回一个行列表。然后,当您说lines[3]时,您将获得第 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

那应该对你有用。

于 2013-08-19T00:18:15.657 回答
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 字符。(就在“温度”之后)这可能是您看到的一些奇怪的字符。如果您只对带有数字的行感兴趣,则可以忽略它们。

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

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...
于 2013-08-19T00:06:45.623 回答
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
于 2013-08-19T00:13:52.787 回答
0

使用readLines()是内存效率低下的。它将整个文件放入内存。相反,请执行以下操作:

[i.split() for i in open('filename.txt')]
于 2020-04-10T14:49:53.973 回答