0

我正在尝试编写一个采用文件名的函数。它应该打开文件,读取它,然后将其写入我称为 convert.txt 的文件中,并进行以下修改:文件中出现的每个数字都应替换为大写字母中的数字。前任。- 如果在第一个文件中给出“3 加 4 等于 7”,则新文件“converted.txt”将拼写为“三加四等于七”。我需要担心的唯一数字是 0 到 9 之间。我有多个问题。我是否创建名为 convert.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"
4

2 回答 2

1

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

newFile.write(element)

但是,您也有一些事情是错误的。

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

其次,字符串"0"和数字0在 Python 中是不同的值。永远不会有字符串== 0

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

最后,file2File2不是一回事,所以NameError如果你定义一个名字然后使用另一个名字,你会得到一个。


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

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)

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

于 2013-11-12T22:37:42.307 回答
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。

于 2013-11-13T00:29:08.860 回答