我的目标是在文本文件中转换此文本(全部在一行中):
a b s d p
5 4 3 3 2
..........
....pp..s.
........s.
.a......s.
.a.....b..
.a.....b..
.a.....b..
.a.ddd.b..
..........
..........
并有一个输出:[[' a',' b',' s',' d',' p'],[5,4,3,3,2]] 但是我收到以下错误: ship_characters.append(STR(炭)) 的MemoryError
这是我的代码:
def read_ship_data(game_file):
ship_characters = []
ship_sizes = []
game = open(game_file, 'r')
for line in game:
for char in line:
while char != '.':
if char.isalpha():
ship_characters.append(str(char))
elif char.isnumeric():
ship_sizes.append(int(char))
return [ship_characters , ship_sizes]
答案 0 :(得分:0)
现在,您在第一个字符上无限循环并将其附加到列表中。你的while循环永远不会停止,因为'a' != '.'
永远都是真的。
如果你只想要2个第一行并且格式永远不会改变,你应该使用更简单的东西:
def read_ship_data(game_file):
with open(game_file, 'r') as file:
ship_characters = file.readline().strip().split()
ship_sizes = file.readline().strip().split()
ship_sizes = [int(i) for i in ship_sizes]
return [ship_characters, ship_sizes]
答案 1 :(得分:0)
你永远在循环:
for char in line:
while char != '.':
if char.isalpha():
ship_characters.append(str(char))
elif char.isnumeric():
ship_sizes.append(int(char))
您通过char
为一次迭代设置line
的值,然后只要该值不是while
,您就会继续'.'
循环 - 但不会您在while
循环中的哪个位置更改了char
的值。这发生在while循环之外,当它进入for循环的下一个循环时。
您好像想删除while
循环,而不是if char != '.':
?
编辑:实际上没有必要单独捕捉'.'
- 您已经在使用isalpha()
和isnumeric()
进行测试了 - 请注意,如果您在isdigit()
,则需要'.'
Python 2.x并且不使用unicode - 而for char in line:
if char.isalpha():
ship_characters.append(str(char))
elif char.isnumeric():
ship_sizes.append(int(char))
else:
pass
#do something for non-letter and non-number values if you want
在这两者上都返回False。所以你可以这样做:
awk '/\<vol([[:blank:]]+[[:digit:]]+){2}/{print >> "deleted"; next} 1' file
答案 2 :(得分:0)
其他人已经确定了内存错误的原因:无限循环。
假设您需要文件中的前两行是更好的方法:
def read_ship_data(game_file):
with open(game_file) as game_file:
return [line.split() for line in (next(game_file), next(game_file))]
这只是从文件中读取前两行(带next(file)
),然后在列表推导中拆分行,这是从函数返回的。
如果需要将第二行的值转换为整数:
def read_ship_data(game_file):
with open(game_file) as game_file:
return [next(game_file).split(), [int(x) for x in next(game_file).split()]]