2016-04-12 10 views
-1

私はファイルを読み込み、すべての行の長さが同じかどうかを判断する必要があります。彼らは私が "良い"フォルダにファイルを移動し、それらがすべて同じ長さでない場合、私は "悪い"フォルダに移動し、どの行が残りの部分と同じではないことを言うdocを書く。どのような助けや方法で始めることができますか?ファイルを読み込んで、すべての行が同じ長さであるかどうかを調べる

+0

コードのスニペットをお願いしますか?ヒント:この作業を行うためにいくつかの 'for'ループとdo-whileループが必要です。さらに、各行と各ページの状態を保存します。 Word文書用のVBS。これは、出力を生成するたびに呼び出されるテンプレートとして作成されます。ここで多くの仕事があります。 – Sparky256

答えて

-1

まず第一に、あなたはここで、example.txtをファイルを読み込み、リスト内のすべての行を入れて、contentことができます。

with open(filename) as f: 
    content = f.readlines() 

次は行の末尾からすべての改行文字をトリミングし、それを配置する必要があります別のリストresult中:今すぐ

for line in content: 
    line = line.strip() 
    result.append(line) 

あなたが悪いの行をしたいので、それはすべての文の長さを取得することは難しいことではありません、そして、リストをあなたがループ:

for line in result: 
    lengths.append(len(line)) 

したがって、resultのi番目の要素の長さは、[lengthsのi番目の要素]です。リスト内でどのような行の長さが最も多く発生しているかを判断することができます。これは1行のように簡単です!

most_occuring = max(set(lengths), key=lengths.count) 

今、私たちは別のfor-loopが最も-occuringに対応し、bad-linesにそれらを追加しない長されたチェックすることができます:

for i in range(len(lengths)): 
    if (lengths[i] != most_occuring): 
     bad_lines.append([i, result[i]]) 

次のステップは、ファイルが行く必要チェックです、良いフォルダ、または悪いフォルダ:

if len(bad_lines == 0): 
    #Good file, move it to the good folder, use the os or shutil module 
    os.rename("path/to/current/file.foo", "path/to/new/desination/for/file.foo") 
else: 
    #Bad file, one or more lines are bad, thus move it to the bad folder 
    os.rename("path/to/current/file.foo", "path/to/new/desination/for/file.foo") 

行う可能な、別のファイルへの不正な行を書いている最後のステップは、我々はすでに悪いのラインを持っているので、リストbad_linesに:

with open("bad_lines.txt", "wb") as f: 
    for bad_line in bad_lines: 
     f.write("[%3i] %s\n" % (bad_line[0], bad_line[1])) 

それは、docファイルではありませんが、私はこれは素晴らしいスタートだと思います。本当にdocファイルに書きたい場合は、docxモジュールを見ることができます。

EDIT:ここにpythonスクリプトの例を示します。

with open("example.txt") as f: 
    content = f.readlines() 

result = [] 
lengths = [] 

#Strip the file of \n 
for line in content: 
    line = line.strip() 
    result.append(line) 
    lengths.append(len(line)) 

most_occuring = max(set(lengths), key=lengths.count) 
bad_lines = [] 

for i in range(len(lengths)): 
    if (lengths[i] != most_occuring): 
     #Append the bad_line to bad_lines 
     bad_lines.append([i, result[i]]) 

#Check if it's a good, or a bad file 
#if len(bad_lines == 0): 
    #Good File 
    #Move file to the good folder... 
#else: 
    #Bad File 

with open("bad_lines.txt", "wb") as f: 
    for bad_line in bad_lines: 
     f.write("[%3i] %s\n" % (bad_line[0], bad_line[1])) 
+0

'line = line.strip()'は、行末の改行文字より少しだけトリムします。 – Evert

+0

とにかく改行を削除する必要はありません。それらは同じ長さでなければなりません。 – zondo

+0

あなたはそれについてもう少しストリッピングしていますが、それは仕事を完了します。あなたは実際にそれを取り除くこともできますが、それはリストのほうがきれいに見えます。それを省略した場合は、書き込みファイルの部分にある\ nも削除する必要があります。 これがダウンリストに追加された理由ですか?これは私の最初の答えですので、改善すべき点を知りたいと思います。 私はあなたの答えzondoにコメントすることはできませんが、彼はまた異なっている行を尋ねるので、それらのすべてをループする必要があります。私の答えでは、時間の効率を上げるために部品を1つのループにまとめることができることに注意してください(それほど多くはありませんが、まだO(n)になります) –

0

あなたはall()を使用する必要があります。

with open(filename) as read_file: 
    length = len(read_file.readline()) 
    if all(len(line) == length for line in read_file): 
     # Move to good folder 
    else: 
     # Move to bad folder 

all()が短絡されているので、それは最初の非一致でファイルの読み込みを停止します。

+0

私はこのメソッドを試していますが、このエラーが発生していますlength = len(file.readline())AttributeError: 'str'オブジェクトに 'readline'属性がありません –

+0

@JustinStarkman:すみません、今修正されました。 – zondo

関連する問題