除其他事项外,我的项目需要从文件中检索距离信息,将数据转换为整数,然后将它们添加到128 x 128矩阵中。
从行读取数据时,我遇到了一个僵局。
我检索它:
distances = []
with open(filename, 'r') as f:
for line in f:
if line[0].isdigit():
distances.extend(line.splitlines())`
生成一个字符串列表。
,
int(distances) #does not work
int(distances[0]) # produces the correct integer when called through console
但是,空格会在后面的过程中出现。list的一个例子:
['966']['966', '1513' 2410'] # the distance list increases with each additional city. The first item is actually the distance of the second city from the first. The second item is the distance of the third city from the first two.
int(distances[0]) #returns 966 in console. A happy integer for the matrix. However:
int(distances[1]) # returns:
Traceback(最近一次调用):文件",第1行ValueError: int()以10为基数的无效文字:'1513 2410'
我有一点偏好更python的解决方案,像列表理解之类的,但在现实中-任何和所有的帮助都是非常感谢的。
感谢您的宝贵时间。
您从文件中获得的所有信息最初都是字符串。你必须解析信息,并在程序中将其转换为不同的类型和格式。
-
int(distances)
不起作用,因为正如您所观察到的,距离是字符串的列表。不能将整个列表转换为整数。(正确答案是什么?) -
int(distances[0])
工作是因为您只将第一个字符串转换为整数,并且字符串表示整数,因此转换工作。 -
int(distances[1])
不起作用,因为出于某种原因,列表的第2和第3元素之间没有逗号,因此它隐式地连接到字符串1513 2410
。不能将其转换为整数,因为它有一个空格。
有几种不同的解决方案可能适合您,但这里有几个明显适合您的用例:
distance.extend([int(elem) for elem in line.split()])
只有当您确定line.split()
返回的列表中的每个元素都可以进行此转换时才会起作用。您也可以稍后一次完成整个distance
列表:
distance = [int(d) for d in distance]
或
distance = map(int, distance)
你应该尝试一些解决方案,并实现你认为能给你正确工作和可读性的最佳组合。
我猜您想在所有空格上进行分割,而不是在换行符上。如果文件不大,就全部读入:
distances = map(int, open('file').read().split())
如果某些值不是数字:
distances = (int(word) for word in open('file').read().split() if word.isdigit())
如果文件非常大,使用生成器来避免一次读取所有文件:
import itertools
with open('file') as dists:
distances = itertools.chain.from_iterable((int(word) for word in line.split()) for line in dists)