如何将.txt文件中的行复制到带有修改的新.txt文件中

时间:2013-11-15 21:18:48

标签: python python-3.x text-files

我正在尝试复制.txt文件中的行,并将它们写入一个新的.txt文件中,并进行微小的更改。 例如,如果文件显示为0 is less than 1,我想将其复制到新文件中,但请说ZERO is less than ONE。我已经能够创建一个新文件,但没有任何内容写入其中。

def numbers(fileName):
file = open(fileName, "r")
newFile = 'converted.txt'
converted = open(newFile, "w")
for line in file:
    if "0" in line:
        line.replace("0", "ZERO")
    elif "1" in line:
        line.replace("1", "ONE")
    else:
        return
return

3 个答案:

答案 0 :(得分:1)

您的代码存在两个大问题:

首先,line.replace不会对line本身做任何事情。正如文档所说,它将:

  

返回字符串的副本,其中所有出现的substring old都替换为new ...

但是你没有存储新的字符串,或用它做任何其他事情。

其次,你永远不会向converted写任何东西。

一次修复两个:

for line in file:
    if '0' in line:
        converted.write(line.replace('0', 'ZERO'))
    elif '1' in line:
        converted.write(line.replace('1', 'ZERO'))
    else:
        return

但是,你也有一些小问题。您第一次找到没有return0的行时1。如果一行包含01,则只会替换0。您永远不会close该文件,这意味着该文件可能永远不会刷新到磁盘,并且可能最终为空或不完整。所以,让我们解决所有这些问题:

with open(fileName, "r") as file, open('converted.txt', 'w') as converted:
    for line in file:
        line = line.replace("0", "ZERO")
        line = line.replace("1", "ONE")
        converted.write(line)

replace所有0都是绝对安全的,即使没有 - 它只是不会做任何事情。 (如果你试图通过跳过昂贵的工作来优化事情,如果没有工作要做,"0" in linereplace一样长,当没有任何事可做时,你实际上已经很难过了事情......这是在你的编程生涯早期学到的一个很好的教训。)这意味着你根本不需要if语句,你不需要修改你链接它们的方式,并且您对return中的else没有问题。

with语句会在您离开时自动为closefile调用converted(即使您提前离开,因为,例如,意外的例外)。

答案 1 :(得分:0)

  1. 打开文件时使用with自动清理它们。
  2. 你永远不会在文件中写任何东西
  3. 如果该行没有return0,您确定要1吗?
  4. -

    def numbers(filename):
        with open(filename, 'rU') as file_in:
            with open('converted.txt', 'w') as file_out:
                for line in file_in:
                    if '0' in line:
                        line = line.replace('0', 'ZERO')
                    elif '1' in line:
                        line = line.replace('1', 'ONE')
    
                    file_out.write(line)
    

答案 2 :(得分:0)

TkTech和abarnet在如何打开文件和保存返回值方面都有一些很好的建议。自动清理很好。

虽然有一个合乎逻辑的问题。在你给出的例句中,“0小于1”,单行中同时包含“0”和“1”。如果您要通过任一函数发送该行,则会将该行修改为“ZERO小于1”而不是您的预期“ZERO小于1”。这样做的原因是因为第一个if语句会捕获“0”,但是使用elif或者甚至会向程序表明“你已经找到了第一个条件,不用费心去检查其余的条件”。既然你想要捕获任何1,无论是否存在任何0,你都不应该使用任何其他语句。

以下是我的写作方式:

def convert(file):
    in_file = open(file, "r")
    out_file = open("/home/user/temp/converted.txt", "w+")
    # Read up on what r and w+ mean; docs.python.org

    for line in in_file:
        # Catch 0 in line
        if "0" in line:
            line = line.replace("0", "ZERO")

        # Catch 1 in line
        if "1" in line:
            line = line.replace("1", "ONE")

        # Write line to file
        out_file.write(line)
    #end for

    # Close open files; this is common practice in C
    # Not needed in Python when using "with open(file, 'r') as filename:"
    in_file.close()

    # Force it to write out anything left in buffer; not usually needed as Python usually does this when calling close()
    out_file.flush()
    out_file.close()

除了根据预期输入文件的格式可以进行的改进之外,我的代码还有许多改进。

  1. 我可以使用TkTech的建议,然后我不需要在最后关闭任何东西。
  2. 如果我想要查找的不仅仅是一些东西,我可以使用字典或其他数据结构来存储所有预期的更改。
  3. 然而,它确实在它的当前状态下工作:

    0 is less than 1
    1 is greater than 0
    0 1
    1     0
    

    给我这个:

    ZERO is less than ONE
    ONE is greater than ZERO
    ZERO ONE
    ONE     ZERO
    

    比这更复杂的文件可能会给您带来意想不到的结果,例如:

    0 is less than 1 but larger than -1 ==> ZERO is less than ONE but larger than -ONE
    0 is larger than -1 ==> ZERO is larger than -ONE
    2 is larger than 0 ==> 2 is larger than ZERO
    0 1 2 3 4 5 6 7 8 9 10 ==> ZERO ONE 2 3 4 5 6 7 8 9 ZEROONE
    0000001 ==> ZEROZEROZEROZEROZEROZEROONE
    1001101 ==> ONEZEROZEROONEONEZEROONE