更改文件行 - Python

时间:2012-07-06 09:32:23

标签: python file

我有一个名为'users.txt'的文件,其结构如下: username:info_about_the_user.

这样的事情:

users.txt:

  

mark:stuffabouthim
anthony:stuffabouthim
peter:stuffabouthim
peterpeter:stuffabouthim
peterpeterpeter:stuffabouthim
peterpeterpeterpeter:stuffabouthim

脚本的以下部分需要更改一行(更改有关用户的信息),但是当字符串重复时(peter - peterpeter)我遇到了问题,我不知道如何修复它。

def test():
    fn = 'users.txt'
    f = open(fn)
    output = []
    changeuser = 'peterpeter'
    userinfo = 'HeIsTall'
    for line in f:
        if not changeuser+":" in line:
            output.append(line)
    f.close()
    f = open(fn, 'w')
    f.writelines(output)
    f.close()
    f = open("users.txt", "a")
    f.write(changeuser + ":" + userinfo+"\n")
    f = open("users.txt", "a")

test()

这是我的输入:

输入:users.txt:

  

标记:stuffabouthim
anthony:stuffabouthim
peter:stuffabouthim
peterpeter:HesAwesome
peterpeterpeter:stuffabouthim
peterpeterpeterpeter:stuffabouthim

我想更改有关peterpeter的信息并输出以下内容:

我希望输出:users.txt:

  

标记:stuffabouthim
anthony:关于他的东西
彼得:stuffabouthim
peterpeter:HeIsTall
peterpeterpeter:stuffabouthim
peterpeterpeterpeter:stuffabouthim

但这是我的输入。 peterpeter背后的所有行都被删除了。

  

标记:stuffabouthim
      安东尼:stuffabouthim
      彼得:stuffabouthim
      peterpeter:HeIsTall

任何人都可以帮我提供下面的代码以获得所需的输出吗?感谢。

3 个答案:

答案 0 :(得分:3)

您可以使用fileinput模块轻松实现:

import fileinput

def test():
    fn = 'users.txt'

    changeuser = 'peterpeter'
    newinfo = 'HeIsTall'

    for line in fileinput.input(fn, inplace=1):
        user, oldinfo = line.split(':')
        print '%s:%s' % (user, newinfo if user == changeuser else oldinfo.replace('\n', ''))

if __name__ == "__main__":
    test()

答案 1 :(得分:2)

试试这个:

def test():
    fn = 'users.txt.txt'
    f = open(fn)
    output = []
    changeuser = 'peterpeter'
    userinfo = 'HeIsTall'
    for line in f:
        if line.strip().split(':')[0]!=changeuser:
            output.append(line)
        else:
            output.append(changeuser + ":" + userinfo+"\n")

    f.close()
    f = open(fn, 'w')
    f.writelines(output)
    f.close()

test()

<强>输出:

mark:stuffabouthim
anthony:stuffabouthim
peter:stuffabouthim
peterpeter:HeIsTall
peterpeterpeter:stuffabouthim
peterpeterpeterpeter:stuffabouthim

答案 2 :(得分:2)

if - 子句中存在逻辑错误,其中 DELETES 所有peters *,唯一剩下的是您附加到文件的那个。

for line in f:
        if not changeuser+":" in line:  #THAT MEANS ALL PETERS ARE IGNORED!
            output.append(line)

通常更容易理解积极的条款然后否定:

for line in f:
   if changeuser+":" in line:
      output.append('%s:%s\n' %(changeuser,userinfo))
   else:
      output.append(line)

好的代码很容易阅读。尝试编写代码,就像尝试编写报告一样!这会导致自动将代码拆分为较小的部分,如函数。 e.g:

lines = read_all_lines_from_file(filename)
change_user_info(lines, user, userinfo)
save_lines_to_file(lines, filename)

您的代码被分成更小的部分,如果发生错误,您可以将其固定为几行代码而不必处理多个页面。 ; - )