【问题标题】:Replace a word in a file替换文件中的单词
【发布时间】:2010-02-12 08:02:18
【问题描述】:

我是 Python 编程新手...

我有一个 .txt 文件.......看起来像..

0,工资,14000

0,奖金,5000

0,礼物,6000

我想将每行中的第一个“0”值替换为“1”。我怎样才能做到这一点?任何人都可以帮助我....带有示例代码..

提前致谢。 尼米利吉

【问题讨论】:

    标签: python file


    【解决方案1】:

    我知道您问的是 Python,但请原谅我建议使用不同的工具可能更适合这项工作。 :) 这是通过sed 的单线:

    sed 's/^0,/1,/' yourtextfile.txt > output.txt
    

    这会将正则表达式/^0,/(匹配出现在行首的任何0,)应用于每一行,并将匹配的文本替换为1,。输出被定向到指定的文件 output.txt 中。

    【讨论】:

    • 他想做的事情可能是更大任务的一部分。 “更适合这份工作”也许不是。
    • 正则表达式可以使用 Python regex 模块来实现。因此,虽然sed 可能不是一个好的答案,但正则表达式的概念是,恕我直言。
    【解决方案2】:
    inFile = open("old.txt", "r")
    outFile = open("new.txt", "w")
    for line in inFile: 
        outFile.write(",".join(["1"] + (line.split(","))[1:]))
    
    inFile.close()
    outFile.close()
    

    如果您想要更通用的内容,请查看 Python csv 模块。它包含用于处理文件中的comma-separated values(缩写为 csv)的实用程序。但它可以与任意分隔符一起使用,而不仅仅是逗号。因此,当您的 sample 显然是一个 csv 文件时,您可以按如下方式使用它:

    import csv
    reader = csv.reader(open("old.txt"))
    writer = csv.writer(open("new.txt", "w"))
    writer.writerows(["1"] + line[1:] for line in reader)
    

    用新文件覆盖原始文件:

    import os
    os.remove("old.txt")
    os.rename("new.txt", "old.txt")
    

    我认为写入新文件然后重命名它比直接覆盖源文件更具容错性并且不太可能损坏您的数据。想象一下,当源文件已经读入内存并重新打开以进行写入时,您的程序引发了异常。因此,您会丢失原始数据,并且由于程序崩溃而无法保存新数据。就我而言,我只会在保留原始数据的同时丢失新数据。

    【讨论】:

    • +1 用于提及 csv 模块。它真的救了我很多次这么
    【解决方案3】:
    o=open("output.txt","w")
    for line in open("file"):
        s=line.split(",")
        s[0]="1"
        o.write(','.join(s))
    o.close()
    

    或者你可以使用文件输入和就地编辑

    import fileinput
    for line in fileinput.FileInput("file",inplace=1):
        s=line.split(",")
        s[0]="1"
        print ','.join(s)
    

    【讨论】:

      【解决方案4】:
      f = open(filepath,'r')
      data = f.readlines()
      f.close()
      
      edited = []
      for line in data:
          edited.append( '1'+line[1:] )
      
      f = open(filepath,'w')
      f.writelines(edited)
      f.flush()
      f.close()
      

      或者在 Python 2.5+ 中:

      with open(filepath,'r') as f:
         data = f.readlines()
      
      with open(outfilepath, 'w') as f:
         for line in data:
            f.write( '1' + line[1:] )
      

      应该这样做。不过,我不建议将它用于真正的大文件;-) 发生了什么(例如 1):

      1:以读取方式打开文件

      2,3:将所有行读入一个列表(每一行是一个单独的索引)并关闭文件。

      4,5,6:遍历列表,构造一个新列表,其中每一行的第一个字符被替换为 1。 line[1:] 从索引 1 开始对字符串进行切片。我们将 1 与截断的列表连接起来。

      7,8,9:以写入模式重新打开文件,将列表写入文件(覆盖),刷新缓冲区,关闭文件句柄。

      在例如。 2:

      我使用 with 语句让文件自己处理关闭,但本质上做的是相同的事情。

      【讨论】:

      • rw 无效,即使不是,也会从文件末尾开始写入。
      • 哦,快,我会解决这个问题的(我可以发誓 append 是一个 '+')。
      • 看来'rw'模式并非完全无效。您可以读取文件,但如果您尝试写入,则会收到 IOError(即使您在读取之前尝试写入)。
      • 我猜,flush() 在你关闭文件时是多余的。
      猜你喜欢
      • 2015-03-02
      • 2015-03-08
      • 1970-01-01
      • 2020-01-06
      • 1970-01-01
      • 2019-04-10
      • 2014-04-15
      • 2015-01-30
      相关资源
      最近更新 更多