我正在尝试制作一个程序,将文件中的所有字母交换成不同的字母。 当我使用超过line.replace时,它会写入双倍数量的文本。 需要有效的方法将每个角色转变为不同的角色。 任何想法都表示赞赏。
import sys,os,time
f1 = open('test.txt', 'r')
f2 = open("test.encrypted", 'w')
for line in f1:
f2.write(line.replace('a', '~')) <--- Need more character lists to replace
f2.write(line.replace('b', '~'))
f1.close()
f2.close()
print(f1)
答案 0 :(得分:3)
首先更改您的line
变量,只有在完成替换后才会写:
for line in f1:
line = line.replace('a', '~')
line = line.replace('b', '~')
f2.write(line)
请注意,现在只有一个 .write()
来电。
您甚至可以链接.replace()
来电:
for line in f1:
line = line.replace('a', '~').replace('b', '~')
f2.write(line)
对于单字符替换,您可能需要考虑str.translate()
method,并结合string.maketrans()
helper function:
from string import maketrans
tilde_replace = maketrans('ab', '~' * 2)
for line in f1:
line = line.translate(tilde_replace)
f2.write(line)
答案 1 :(得分:3)
您可以使用内置于字符串中的translate
方法同时执行所有替换。 string.maketrans()
函数有两个参数,第一个是列出要替换的字符的字符串,第二个字符串(必须与第一个字符串长度相同)显示相应位置的替换字符。第一个字符串。
>>> import string
>>> t = string.maketrans('abcdefghijklmnopqrstuvwxyz', 'zyxwvutsrqponmlkjihgfedcba')
>>> s = 'this is a string that will get mixed up'
>>> s.translate(t)
'gsrh rh z hgirmt gszg droo tvg nrcvw fk'
...然后将完成的字符串写出来。
答案 2 :(得分:1)
创建一个映射字典,将字符映射到其替换项:
<强>演示:强>
>>> dic = {'a':'~','b':'~'}
>>> strs = "abcd"
>>> strs = "".join([dic.get(c,c) for c in strs])
>>> strs
'~~cd'
答案 3 :(得分:0)
你写了两遍文本,因为你正在调用write()两次。尝试像
这样的东西newLine = line
newLine.replace('a', '~')
newLine.replace('b', '~')
f2.write(newLine)
答案 4 :(得分:0)
有很多解决方案。你可以这样做。
source = 'test.txt'
dest = 'test.encrypted'
tbl = {'f': '~', 'o':'#', 'b': ';', 'a': '[', 'r': '$'}
open(dest, 'w').write(''.join([tbl.get(c, c) for c in open(source, 'r').read()]))
哪个给出了
foobar => ~##;[$
其他人建议的string.maketrans()
解决方案更优雅。