我试图编写一个带有文件名的函数。它应该打开文件,读取它,然后将其写入我调用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"
答案 0 :(得分:1)
缺少的唯一部分是将每个元素写入newFile
的部分:
newFile.write(element)
然而,有些事情你也有错误。
首先,每一行是一个包含多个单词的字符串,后跟换行符。所以,它永远不会是"0"
。您可能希望将该行拆分为单词或字符或其他内容,而不是将该行作为一个整体进行搜索。要拆分为单词,请查看字符串上的split
方法。要拆分成字符,只需循环遍历字符串。
其次,字符串"0"
和数字0
在Python中是不同的值。 否字符串将为== 0
。
第三,如果你open
写一个文件,而不是close
,你可能会得到一个不完整甚至是空的文件。使用with
语句会使close
自动出错并且不可能出错,因此您通常应该这样做。
最后,file2
和File2
不是一回事,因此如果您定义一个名称然后使用另一个名称,您将获得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。