1

我正在尝试制作一个程序,将文件中的所有字母交换为不同的字母。当我使用超过 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)
4

5 回答 5

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()方法string.maketrans()

from string import maketrans

tilde_replace = maketrans('ab', '~' * 2)

for line in f1:
    line = line.translate(tilde_replace)
    f2.write(line)
于 2013-07-08T12:58:23.390 回答
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'

...然后写出完成的字符串。

于 2013-07-08T13:00:22.947 回答
1

创建一个映射字典,将字符映射到它们的替换:

演示:

>>> dic = {'a':'~','b':'~'}
>>> strs = "abcd"
>>> strs = "".join([dic.get(c,c) for c in strs])
>>> strs
'~~cd'
于 2013-07-08T13:03:54.710 回答
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()解决方案更优雅。

于 2013-07-08T13:08:56.450 回答
0

你写了双倍的文本,因为你调用了 write() 两次。尝试类似的东西

newLine = line
newLine.replace('a', '~')
newLine.replace('b', '~')
f2.write(newLine)
于 2013-07-08T12:56:34.900 回答