所以我想要做的事情似乎相对简单,但对于我的生活,我却无法得到它。我有一个.txt文件,如
4 2
6 5 1
9 4 5
我希望它的信息可以像我这样使用(即我不需要写一个新的.txt文件,除非有必要。)...
3 1
5 4 0
8 3 4
或,从每个数字中减去1
,但格式保持不变。原件中永远不会有大于1
的数字,因此不可能出现负面影响。令人头疼的是将索引转换为0
而不是1
。可能使事情复杂化的是原始文件打印如
['4 2 /n','6 5 1 /n', '9 4 5 /n']
我做了什么
这是我在StackOverflow上different的found事情的混搭,但我想我会以最麻烦的方式解决这个问题。当我实现它时this一个没有意义..虽然它可能与空格问题在同一轨道上..
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]
我的思维过程是,我需要删除“/ n”并将这些字符串转换为整数,这样我就可以从它们中减去1
。并以某种方式保持格式。格式化是很重要的,因为每行包含有关另一个文件的类似索引行的信息。我不想在最终结果(或打印语句)中看到“/ n”但我仍然希望新行的效果开始。然而,上面的代码不会有两个原因(我知道)。
int(n[:])
抛出错误,因为它不喜欢空格,当我在那里放一个值(比如说0)时,代码打印每行上的第一个数字并减去一个......把它全部放在一条线上。
[3, 5, 8]
所以,取出一个回车并且必须抛出另一个回车似乎是多余的,但我确实需要保持格式化,并且有办法获得所有数字!
这也行不通:
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]
但不是错误的输出而是错误:
ValueError:invalid literal for int() with base 10:''
有没有人对我在这里做错了什么以及如何解决这个问题有任何想法?我正在使用Python 2.6并且是初学者。
答案 0 :(得分: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')
我在上面的例子中在上下文管理器中打开了你的文件,因为这是一个很好的做法(从版本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)
或者,如果您更喜欢1-liner(我没有):
with open("original_filename") as original:
data = [ [int(i) for i in line.split()] for line in original ]
现在如果你打印它:
for lst in data:
print (lst) # [3, 1]
# [5, 4, 0]
# [8, 3, 4]
答案 1 :(得分:4)
这是使用正则表达式实现此目的的一种非常直接的方法。这里的好处是格式保证保持完全相同,因为它将替换现有的数字而不触及任何空格:
import re
def sub_one_repl(match):
return str(int(match.group(0))-1)
for line in original.readlines():
newline = re.sub(r'\d+', sub_one_repl, line).rstrip('\n')
答案 2 :(得分:2)
另一种方法是使用csv模块和列表推导:
from csv import reader
data = [[int(j) - 1 for j in i] for i in reader(open("your_file"), delimiter=' ')]
例如,使用您的数据:
[[3, 1], [5, 4, 0], [8, 3, 4]]
答案 3 :(得分:0)
试试这个:
with open(filepath) as f:
for line in f:
print " ".join([str(int(i)-1) for i in line.split()])
希望有所帮助