2017-07-19 30 views
0

改变一个特定的值我有关于我的代码有问题:Python编程文件

with open('Premier_League.txt', 'r+') as f: 
    data = [int(line.strip()) for line in f.readlines()] # [1, 2, 3] 
    f.seek(0) 

    i = int(input("Add your result! \n")) 

    data[i] += 1 # e.g. if i = 1, data now [1, 3, 3] 

    for line in data: 
     f.write(str(line) + "\n") 

    f.truncate() 
    print(data) 

代码工作是包含例如文件“Premier_League.txt”:

1 
2 
3 

其中i=1 被转换并保存到已存在的文件(以前的信息被删除)

1 
3 
3 

我的问题是,我想选择在MATRIS例如一个特定的值(不仅是垂直线):

0 0 0 0 
0 0 0 0 
0 0 0 0 

在这里我想将其更改为例如:

0 1 0 0 
0 0 0 0 
0 0 0 0 

当我运行这个槽我的计划,这似乎:

ValueError: invalid literal for int() with base 10: '1 1 1 1' 

所以我的问题是:如何更改包含多个垂直行值的文件中的特定值?

+0

问题:为什么“0 1 0 0”而不是说“0 0 1 0”或其他任何组合? –

+0

不,你应该能够将它改变为两者,它只是进入并且改变**文件**中的特定值,因此它可以是“0 1 0 0”或“0 0 1 0”,或者为什么不是'0 1 1 0' – Argentum

+0

这是[XY问题]的定义(https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。你正在接近整个事情的错误。 –

回答

3

问题是你不处理尺寸的增加数目正确。尝试这样的事情;例如:

with open('Premier_League.txt', 'r+') as f: 
    # Note this is now a 2D matrix (nested list) 
    data = [[int(value) for value in line.strip().split()] for line in f ] 
    f.seek(0) 

    # We must specify both a column and row 
    i = int(input("Add your result to column! \n")) 
    j = int(input("Add your result to row! \n")) 

    data[i][j] += 1 # Assign to the index of the column and row 

    # Parse out the data and write back to file 
    for line in data: 
     f.write(' '.join(map(str, line)) + "\n") 

    f.truncate() 
    print(data) 

您也可以使用生成器表达式来写入文件,例如;

# Parse out the data and write back to file 
f.write('\n'.join((' '.join(map(str, line)) for line in data))) 

而不是;

# Parse out the data and write back to file 
for line in data: 
    f.write(' '.join(map(str, line)) + "\n") 
+0

谢谢!救生员 – Argentum

+0

只是一个问题,这两个例子;他们基本上行事一样吗? – Argentum

+0

只是第一个写得更简单吗? ^^ – Argentum

1

首先,您试图将字符串'0 0 0 0'解析为一个int,这就是您所得到的错误。为了解决这个问题,执行:

data = [[int(ch) for ch in line.strip().split()] for line in f.readlines()] 

这将创建一个二维数组,其中第一个索引对应于行,并且所述第二索引对应于列。然后,您可能希望用户为您提供两个值,而不是单一的i,因为您正尝试在2D数组中进行编辑。

编辑:
所以,你的下面的代码看起来就像这样:

i = int(input("Add your result row: \n")) 
j = int(input("Add your result column: \n")) 

data[i][j] += 1 
# For data = [[1,2,1], [2,3,2]], and user enters i = 1 
# and j = 0, the new data will be [[1,2,1], [3,3,2]] 
+0

我不完全相信我理解你。你的意思是我应该改变我的'data = [int(line.strip())for line in f.readlines()]#[1,2,3]'到'data = [[int(ch)for ch in line.strip()。split('')] for line in f.readlines()]',但程序告诉我:'TypeError:'int'对象不可迭代' – Argentum

+0

抱歉有一个小错误,它应该是split()而不是split('')'。但用户Tom Wyllie已经解决了它 – dhdavvie