除此之外,我的项目需要从文件中检索距离信息,将数据转换为整数,然后将它们添加到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
然而,这些空间随后会增加。 列表的一个例子:
['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:
追踪(最近一次通话): 文件“”,第1行,in ValueError:int()的基数为10的无效文字:'1513 2410'
我略微偏爱更多的pythonic解决方案,比如列表理解等,但在现实中 - 非常感谢任何和所有帮助。
感谢您的时间。
答案 0 :(得分:3)
首先从文件中获取的所有信息都是字符串。您必须解析信息并将其转换为程序中的不同类型和格式。
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)
您应该尝试一些解决方案并实施您认为可以为您提供正确工作和可读性的最佳组合。
答案 1 :(得分:1)
我的猜测是你希望在所有空格上分割,而不是换行。如果文件不大,请直接阅读:
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)