打开,写入新文件,换成单词

时间:2013-11-12 22:33:42

标签: python

我试图编写一个带有文件名的函数。它应该打开文件,读取它,然后将其写入我调用converted.txt的文件中进行此修改:文件中每次出现的数字都应该用大写拼写的数字替换。恩。 - 如果在第一个文件中给出" 3加4等于7"新文件" converted.txt"将拼出" THREE + FOUR等于SEVEN"。我需要担心的唯一数字是0到9之间。我有多个问题。我是否创建名为converted.txt的文件并尝试从第一个文件进行复制。如果是这样,我该怎么做?如何将其更改为新文件中的单词

到目前为止,这是我的代码:

def numbers(fileName):
    file = open(fileName, "r")
    file2 = "converted.txt"
    newFile = open(File2, "w")
    for element in file:
        if element == 0:
            element = "ZERO"
        elif element == 1:
            element = "ONE"
        elif element == 2:
            element = "TWO"
        elif element == 3:
            element = "THREE"
        elif element == 4:
            element = "FOUR"
        elif element == 5:
            element = "FIVE"
        elif element == 6:
            element = "SIX"
        elif element == 7:
            element = "SEVEN"
        elif element == 8:
            element = "EIGHT"
        elif element == 9:
            element = "NINE"

2 个答案:

答案 0 :(得分:1)

缺少的唯一部分是将每个元素写入newFile的部分:

newFile.write(element)

然而,有些事情你也有错误

首先,每一行是一个包含多个单词的字符串,后跟换行符。所以,它永远不会是"0"。您可能希望将该行拆分为单词或字符或其他内容,而不是将该行作为一个整体进行搜索。要拆分为单词,请查看字符串上的split方法。要拆分成字符,只需循环遍历字符串。

其次,字符串"0"和数字0在Python中是不同的值。 字符串将为== 0

第三,如果你open写一个文件,而不是close,你可能会得到一个不完整甚至是空的文件。使用with语句会使close自动出错并且不可能出错,因此您通常应该这样做。

最后,file2File2不是一回事,因此如果您定义一个名称然后使用另一个名称,您将获得NameError


此外,elif的长链是笨拙的,很容易出错(特别是如果你以后必须修复或扩展它)。试试这个:

numerals = ['ZERO', 'ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 
            'SIX', 'SEVEN', 'EIGHT', 'NINE', 'TEN']
try:
    number = int(element)
    element = numerals[number]
except ValueError:
    pass

全部放在一起:

def numbers(fileName):
    numerals = ['ZERO', 'ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 
                'SIX', 'SEVEN', 'EIGHT', 'NINE', 'TEN']
    fileName2 = "converted.txt"
    with open(fileName, "r") as file, open(fileName2, "w") as file2:
        for line in file:
            for element in line:
                try:
                    number = int(element)
                    element = numerals[number]
                except ValueError:
                    pass
                file2.write(element)

显然,像这样逐字逐句地读取和写入文件并不是最有效的方法。您应该查看字符串对象上的其他方法,看看是否有更聪明的东西可以做。或者看看正则表达式,如果你愿意学习一些有点棘手的东西。

答案 1 :(得分:0)

也许是一个简单的查找/替换:

def spell_numbers(in_file, out_file):
    s = open(in_file, 'r').read()
    s = s.replace('0', 'ZERO')
    s = s.replace('1', 'ONE')
    s = s.replace('2', 'TWO')
    s = s.replace('3', 'THREE')
    s = s.replace('4', 'FOUR')
    s = s.replace('5', 'FIVE')
    s = s.replace('6', 'SIX')
    s = s.replace('7', 'SEVEN')
    s = s.replace('8', 'EIGHT')
    s = s.replace('9', 'NINE')
    open(out_file, 'w').write(s)

如果文件太大而无法完整地读入内存:

def spell_numbers(in_file, out_file, buf_size=1024):
    with open(in_file, 'r') as fin, open(out_file, 'w') as fout:
        while True:
            s = fin.read(buf_size)
            if not s: break
            s = s.replace('0', 'ZERO')
            s = s.replace('1', 'ONE')
            s = s.replace('2', 'TWO')
            s = s.replace('3', 'THREE')
            s = s.replace('4', 'FOUR')
            s = s.replace('5', 'FIVE')
            s = s.replace('6', 'SIX')
            s = s.replace('7', 'SEVEN')
            s = s.replace('8', 'EIGHT')
            s = s.replace('9', 'NINE')
            fout.write(s)

一次读取文件buf_size个字节。 1024表示一次1 KiB,1048576表示每次1 MiB。