在python中保持格式的字符串到整数的列表

Aso*_*son 5 python formatting integer list

所以我想要做的事情看起来相对简单,但对于我的生活,我却无法得到它.我有一个.txt文件

4 2
6 5 1
9 4 5
Run Code Online (Sandbox Code Playgroud)

我希望它的信息可以像我这样使用(即我不需要编写新的.txt文件,除非有必要.)...

3 1
5 4 0
8 3 4
Run Code Online (Sandbox Code Playgroud)

或者,1从每个数字中减去,但格式保持不变.永远不会有比1原版更大的数字,因此不可能出现负面影响.这整个头痛是由于转换索引开始0而不是1.可能使事情复杂化的是原始文件打印出来的

['4 2 /n','6 5 1 /n', '9 4 5 /n']
Run Code Online (Sandbox Code Playgroud)

我做了什么

好吧,它是我在StackOverflow 上找到不同东西的混搭,但我想我会以最麻烦的方式来解决它.当我实现它时,这个没有意义..虽然它可能与空格问题在同一轨道上..

origianl = open(file, 'r')
for line in original.readlines():
    newline = line.replace(" \n","")
    finalWithStrings.append(newline)

finalWithIntegers = [map(int,x) for x in finalWithStrings]
finalWithIntegers[:] = [x-1 for x in finalWithIntegers]
Run Code Online (Sandbox Code Playgroud)

我的思维过程是,我需要删除"/ n"并将这些字符串转换为整数,这样我就可以减去1它们.并以某种方式保持格式.格式化是很重要的,因为每行包含有关另一个文件的类似索引行的信息.我不想在最终结果(或打印语句)中看到"/ n"但我仍然希望新行的效果开始.然而,上面的代码不会有两个原因(我知道).

int(n[:]) 抛出一个错误,因为它不喜欢空格,当我在那里放一个值(比如说0)时,代码打印每一行的第一个数字并减去一个...并将它全部放在一行上.

[3, 5, 8]
Run Code Online (Sandbox Code Playgroud)

因此,取出回车并且必须抛出另一个回车似乎是多余的,但我确实需要保持格式化,以及有办法获得所有数字!

这也行不通:

for line in original.readlines():
    newline = line.replace(" \n","")
    finalWithStrings.append(newline)

finalWithIntegers = [map(int,x) for x in finalWithStrings]
finalWithIntegers[:] = [x-1 for x in finalWithIntegers]    
Run Code Online (Sandbox Code Playgroud)

但不是只是一个错误的输出,这是一个错误:

ValueError:invalid literal for int() with base 10:''
Run Code Online (Sandbox Code Playgroud)

有没有人对我在这里做错了什么以及如何解决这个问题有任何想法?我正在使用Python 2.6并且是初学者.

mgi*_*son 9

with open("original_filename") as original:
    for line in original:
        #if you just want the line as integers:
        integers = [ int(i) - 1 for i in line.split() ]
        #do something with integers here ...

        #if you want to write a new file, use the code below:
        #new_line = " ".join([ str(int(i) - 1) for i in line.split() ])
        #newfile.write(new_line + '\n')
Run Code Online (Sandbox Code Playgroud)

我在上面的例子中在上下文管理器中打开了你的文件,因为这是一个很好的做法(从版本2.5开始).当您退出该上下文时,上下文管理器会确保您的文件已正确关闭.

编辑

看起来你可能正在尝试创建一个2D列表......要做到这一点,这样的事情会起作用:

data = []
with open("original_filename") as original:
    for line in original:
        integers = [ int(i) - 1 for i in line.split() ]
        data.append(integers)
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢1-liner(我没有):

with open("original_filename") as original:
    data = [ [int(i) for i in line.split()] for line in original ]
Run Code Online (Sandbox Code Playgroud)

现在,如果你打印它:

for lst in data:
    print (lst)    # [3, 1]
                   # [5, 4, 0]
                   # [8, 3, 4]
Run Code Online (Sandbox Code Playgroud)