读取文本文件并将一些字符放入列表中

时间:2016-07-02 04:03:57

标签: python list text-files

我的目标是在文本文件中转换此文本(全部在一行中):

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]

3 个答案:

答案 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()]]