如何使用 Python 将文本文件读入列表或数组[重复]
- 2025-01-20 09:07:00
- admin 原创
- 98
问题描述:
我正在尝试将文本文件的行读入 python 中的列表或数组。我只需要能够在创建列表或数组后单独访问其中的任何项目。
该文本文件的格式如下:
0,0,200,0,53,1,0,255,...,0.
如上所述...
,实际的文本文件有数百或数千个项目。
我正在使用以下代码尝试将文件读入列表:
text_file = open("filename.dat", "r")
lines = text_file.readlines()
print lines
print len(lines)
text_file.close()
我得到的输出是:
['0,0,200,0,53,1,0,255,...,0.']
1
显然,它将整个文件读入一个仅包含一个项目的列表,而不是单个项目的列表。我做错了什么?
解决方案 1:
您必须使用以下方法将字符串拆分为值列表split()
所以,
lines = text_file.read().split(',')
编辑:我没想到这会引起如此大的关注。这是一种更惯用的方法。
import csv
with open('filename.csv', 'r') as fd:
reader = csv.reader(fd)
for row in reader:
# do something
解决方案 2:
你也可以使用 numpy loadtxt
from numpy import loadtxt
lines = loadtxt("filename.dat", comments="#", delimiter=",", unpack=False)
解决方案 3:
所以你想创建一个列表的列表...我们需要从一个空列表开始
list_of_lists = []
接下来,我们逐行读取文件内容
with open('data') as f:
for line in f:
inner_list = [elt.strip() for elt in line.split(',')]
# in alternative, if you need to use the file content as numbers
# inner_list = [int(elt.strip()) for elt in line.split(',')]
list_of_lists.append(inner_list)
一个常见的用例是列式数据,但我们的存储单位是文件的行,我们逐行读取,因此您可能需要转置
列表列表。这可以用以下习语来完成
by_cols = zip(*list_of_lists)
另一个常见用途是给每一列命名
col_names = ('apples sold', 'pears sold', 'apples revenue', 'pears revenue')
by_names = {}
for i, col_name in enumerate(col_names):
by_names[col_name] = by_cols[i]
这样你就可以对同类数据项进行操作
mean_apple_prices = [money/fruits for money, fruits in
zip(by_names['apples revenue'], by_names['apples_sold'])]
我编写的大部分代码都可以使用标准库中的模块来加速csv
。另一个第三方模块是pandas
,它可以让您自动执行典型数据分析的大部分方面(但具有许多依赖项)。
更新虽然在 Python 2 中zip(*list_of_lists)
返回不同的(转置的)列表列表,但在 Python 3 中情况已经改变并zip(*list_of_lists)
返回一个不可下标的zip 对象。
如果您需要索引访问,则可以使用
by_cols = list(zip(*list_of_lists))
它为您提供了两个版本的 Python 中的列表列表。
另一方面,如果您不需要索引访问而您想要的只是构建一个按列名索引的字典,那么 zip 对象就足够了……
file = open('some_data.csv')
names = get_names(next(file))
columns = zip(*((x.strip() for x in line.split(',')) for line in file)))
d = {}
for name, column in zip(names, columns): d[name] = column
解决方案 4:
这个问题是询问如何将文件中以逗号分隔的值内容读入可迭代列表中:
0,0,200,0,53,1,0,255,...,0.
最简单的方法是使用csv
如下模块:
import csv
with open('filename.dat', newline='') as csvfile:
spamreader = csv.reader(csvfile, delimiter=',')
spamreader
现在,您可以轻松地像这样进行迭代:
for row in spamreader:
print(', '.join(row))
请参阅文档以获取更多示例。
解决方案 5:
我有点晚了,但您也可以将文本文件读入数据框,然后将相应的列转换为列表。
lista=pd.read_csv('path_to_textfile.txt', sep=",", header=None)[0].tolist()
例子。
lista=pd.read_csv('data/holdout.txt',sep=',',header=None)[0].tolist()
注意:相应数据框的列名将采用整数形式,我选择 0,因为我只提取第一列
解决方案 6:
这样更好,
def txt_to_lst(file_path):
try:
stopword=open(file_path,"r")
lines = stopword.read().split('
')
print(lines)
except Exception as e:
print(e)
解决方案 7:
您可以使用 Python 函数中的 build.eval()
with open('test.txt', 'r') as f:
text = f.read()
text_list = eval(text)
输出为:
text: '[0,0,200,0,53,1,0,255]'
text_list: [0, 0, 200, 0, 53, 1, 0, 255]
Python 的 eval() 允许您从基于字符串或基于编译代码的输入中评估任意 Python 表达式。当您尝试从任何以字符串或编译代码对象形式出现的输入中动态评估 Python 表达式时,此函数会非常方便。源代码、文档