我有一个新手问题,需要帮助将文本文件分成列和行。假设我有这样一个文件:
1 2 3 4
2 3 4 5
我希望将其放入名为values = [[]]
的二维列表中。
我可以获取行,这段代码运行良好:
values = map(int, line.split(','))
我不知道该如何描述同样的事情,但针对行和文档而言,说明文档没有任何意义。
谢谢。
我有一个新手问题,需要帮助将文本文件分成列和行。假设我有这样一个文件:
1 2 3 4
2 3 4 5
我希望将其放入名为values = [[]]
的二维列表中。
我可以获取行,这段代码运行良好:
values = map(int, line.split(','))
我不知道该如何描述同样的事情,但针对行和文档而言,说明文档没有任何意义。
谢谢。
f = open(filename,'rt')
a = [[int(token) for token in line.split()] for line in f.readlines()[::2]]
::2
下标。map
,但是将列表推导和map
混合使用似乎很丑陋。readlines()
。 - Björn Pollex[int(token) for token in line.split()]
获取line.split()
返回的列表中的每个元素,将其命名为 token
并对其执行int()
,从而形成另一个序列,其中包含一行中所有数字作为整数。我本可以选择任何其他名称。 - Alexander Gesslerfilename
似乎是文件的路径,而不是打开的文件句柄!使用open(filename,'rt')
来获取这样的句柄。 - Alexander Gesslerimport csv
import itertools
values = []
with open('text.file') as file_object:
for line in csv.reader(file_object, delimiter=' '):
values.append(map(int, line))
print "rows:", values
print "columns"
for column in itertools.izip(*values):
print column
输出为:
rows: [[1, 2, 3, 4], [2, 3, 4, 5]]
columns:
(1, 2)
(2, 3)
(3, 4)
(4, 5)
通过某种方法将数据输入到您的程序中。这里有一个:
f = open(tetxfile, 'r')
buffer = f.read()
f.close()
table = [map(int, row.split()) for row in buffer.strip().split("\n")]
>>> print table
[[1, 2, 3, 4], [2, 3, 4, 5]]
也许你想要的是有序对,那么可以转置这个表格:
transpose = zip(*table)
>>> print transpose
[(1, 2), (2, 3), (3, 4), (4, 5)]
import re
A,B,C,D = [],[],[],[]
pat = re.compile('([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)')
with open('try.txt') as f:
for line in f:
a,b,c,d = pat.match(line.strip()).groups()
A.append(int(a));B.append(int(b));C.append(int(c));D.append(int(d))
或使用csv模块
编辑
A,B,C,D = [],[],[],[]
with open('try.txt') as f:
for line in f:
a,b,c,d = line.split()
A.append(int(a));B.append(int(b));C.append(int(c));D.append(int(d))
但是,如果数据元素之间有多个空格,这段代码将失败。
编辑2
由于使用正则表达式的解决方案被认为极难理解,因此可以进行如下澄清:
import re
A,B,C,D = [],[],[],[]
pat = re.compile('\s+')
with open('try.txt') as f:
for line in f:
a,b,c,d = pat.split(line.strip())
A.append(int(a));B.append(int(b));C.append(int(c));D.append(int(d))
re.compile('\s+')
之所以能够工作,是因为 \s
不是被识别的转义序列。因此,官方建议在指定正则表达式时始终使用原始字符串。 - Alexander Gesslerre.compile('\\s+')
同样可以工作,虽然**'\s'**是一个被转义的字符串。但它不是一个被转义的RE。呃呃… - eyquem