0

私はこのフォーマットのテキストファイルを持っています:

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

特殊文字、空白、数字、行末などをすべて無視して、その文字だけを別のファイルに書き込むにはどうすればよいですか?たとえば、上記のファイルは次のようになります。

abccdfdenhjcdedfwedfsde.....  

そして、この出力ファイルから、

  • ファイルの終わりまで1文字ずつ読み取ることができる必要があります。
  • 上記のファイルからab、bc、cc、cd、df、...のように一度に2文字を読み取ることができるはずです
  • 上記のファイルからabc、bcc、ccd、cdf、...のように一度に3文字を読み取ることができるはずです

まず、文字のみを読み取って外部ファイルに書き込むにはどうすればよいですか?
ファイルの終わりまでf.read(1)を使用すると、1文字ずつ読み取ることができます。これを適用して一度に2,3文字を読み取るには、1文字だけスキップします(つまり、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)

これは、読んでいる 1 文字を超える余分な文字を見つけようとしますが、要件を満たすことができるという保証はありません。ファイルの最後にいる場合、または次のブロックにアルファベット以外のテキストがたくさんある場合は、読み取りが少なくなる可能性があります。

使用法:

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 に答える