0

我有一个这种格式的文本文件:

abc? cdfde" nhj.cde' dfwe-df$sde.....  

我怎样才能忽略所有的特殊字符、空格、数字、行尾等,只写另一个文件中的字符?例如,上面的文件变成

abccdfdenhjcdedfwedfsde.....  

从这个输出文件中,

  • 应该能够逐个字符地读取单个字符,直到文件结束。
  • 应该能够一次读取两个字符,例如上面文件中的 ab,bc,cc,cd,df,...
  • 应该能够一次读取三个字符,例如上述文件中的 abc,bcc,ccd,cdf,...

首先,我怎样才能只读字符并写入外部文件?
我可以通过使用 f.read(1) 读取单个字符直到文件末尾。我如何应用它来一次读取 2,3 个字符,这也只跳过一个字符(也就是说,如果我有 abcd,我应该阅读 ab,bc,cd 而不是 ab,cd(这个,我认为可以通过 f.read(2)))。谢谢。我这样做是为了密码分析工作,按频率分析密文。

4

2 回答 2

2

如果您需要提前查看(一次读取几个额外的字符),您需要一个缓冲文件对象。下面的类就是这样做的:

import io

class AlphaPeekReader(io.BufferedReader):
    def readalpha(self, count):
        "Read one character, and peek ahead (count - 1) *extra* characters"
        val = [self.read1(1)]

        # Find first alpha character
        while not val[0].isalpha():
            if val == ['']:
                return ''  # EOF
            val = [self.read1(1)]


        require = count - len(val)
        peek = self.peek(require * 3)  # Account for a lot of garbage
        if peek == '':  # EOF
               return val[0]

        for c in peek:
            if c.isalpha():
               require -= 1
               val.append(c)
               if not require:
                   break

        # There is a chance here that there were not 'require' alpha chars in peek
        # Return anyway.
        return ''.join(val)

这会尝试在您正在阅读的一个字符之外找到额外的字符,但不能保证它能够满足您的要求。如果我们在文件末尾或者下一个块中有很多非字母文本,它可能会读取更少。

用法:

with AlphaPeekReader(io.open(filename, 'rb')) as alphafile:
    alphafile.readalpha(3)

演示,使用带有示例输入的文件:

>>> f = io.open('/tmp/test.txt', 'rb')
>>> alphafile = AlphaPeekReader(f)
>>> alphafile.readalpha(3)
'abc'
>>> alphafile.readalpha(3)
'bcc'
>>> alphafile.readalpha(3)
'ccd'
>>> alphafile.readalpha(10)
'cdfdenhjcd'
>>> alphafile.readalpha(10)
'dfdenhjcde'

readalpha()在循环中使用调用,您可以分别获取每个字符以及接下来的两个 2 字节,请使用iter()带有标记的 :

for alpha_with_extra in iter(lambda: alphafile.readalpha(3), ''):
    # Do something with alpha_with_extra
于 2012-09-29T13:11:51.283 回答
0

从文件中读取一行:

import fileinput

text_file = open("Output.txt", "w")
for line in fileinput.input("sample.txt"):
    outstring = ''.join(ch for ch in line if ch.isalpha())
    text_file.write("%s"%outstring)

text_file.close()
于 2012-09-29T13:26:35.543 回答