0

環境

このコードは、ファイル オブジェクトを取得し、awk を使用してそこから情報を抽出することになっています。

'pieceSize' を引数として readlines() を使用します。「pieceSize」は、ファイルを処理する際に readlines() で処理する MB の数です。これは、読み取る必要のあるファイルがコンピューターのメモリよりもはるかに大きい場合に、プログラムに問題が発生しないことを期待して行いました。読み取られているファイルには、多くの行と列があります。

以下のコードは、awk を使用して最初の行から最初のフィールドを読み取ろうとしています。

import os
from subprocess import Popen, PIPE, STDOUT

def extract_info(file_object):
    pieceSize = 16777216 # 16MB
    for line in file_object.readlines(pieceSize):
        eachline = line.rsplit() # removing extra returns
        p = Popen(['awk','{{print `$`1}}'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
        pOut = p.communicate(input=eachline)[0]  
        print(pOut.decode())

エラーメッセージ

私が受け取るエラーは次のようになります...

... in _communicate_with_poll(self, input)
chunk = input[input_offset : input_offset + _PIPE_BUF]
try:
-> input_offset += os.write(fd, chunk)
except OSError as e:
if e.errno == errno.EPIPE:
TypeError: must be string or buffer, not list
4

3 に答える 3

0

どのような出力を達成することを期待しているかは完全には明らかではありません。

ただし、これが役立つ場合があります。

  • awk行の最初の単語を出力するだけの場合に使用する理由は、そのために python を使用できます。
  • メモリより大きいサイズのファイルを読みたい場合は、readlineまたはを使用して各行をロードできます。ファイル全体をロードするおよび のfor line in file_handler使用は避けてください。readlines()read()

これを試して:

with open('myfile.txt') as f:
    for line in f:
        first_word = line.split()[0]
于 2016-03-03T10:40:40.917 に答える
0

split から返されたリスト内の文字列を入力に渡す必要があります。

 pOut, _ = p.communicate(input=eachline[0])

つまり、リストを渡しline.rsplit()ています。正確に何を渡したいのかわからない、多分あなたが望むかもしれませんinput=" ".join(eachline)が、それが何であれ、入力に渡すリスト自体ではなく文字列でなければなりません。また、awk 構文が正しくないようです。

ファイルオブジェクト自体を反復処理して、readlines を完全に回避して行ごとに移動することもできます。

for line in file_object:  

したがって、コード全体は次のようになります。

def extract_info(file_object):
    for line in file_object:
        eachline = line.rsplit() # removing extra returns
        p = Popen(['awk','{print $1}'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
        pOut,_ = p.communicate(input=" ".join(eachline))
        print(pOut.decode())

明らかに、ロジックを修正して、eachline期待どおりのことを行うようにします。

別の注意として、awk を使用する必要はまったくありません。これはすべて python で行うことができます。

def extract_info(file_object):
    for line in file_object:
        eachline = line.split(None, 1)
        print(eachline[0])

または、python3 の map と拡張された iterable unpacking を使用すると、さらに簡潔になります。

def extract_info(file_object):
    for i, *_ in map(str.split, file_object):
        print(i)
于 2016-03-03T10:23:38.383 に答える