0

PythonでCommon Crawlから .warc ファイルを解析しようとしています。

ファイルが巨大なので、最初の数レコードのサンプル/サブセットから始めたいと思います。

配置されている改行/改行を保持しながら、ファイルを切り捨てて最初の X 行のみを含めるにはどうすればよいですか?

これが私がすでに試したことです:

  1. head -n 250 oldfile > newfileこれにより、ファイルの解析に必要な戻り値の一部が削除されます。Hadoop ジョブでこのファイルを使用しようとすると (warcパッケージで読み取る) 、次のエラーが表示されます。

      Traceback (most recent call last):
          File "test.py", line 46, in <module>
            TagGrabber.run()
          File "/var/cc-mrjob/venv/local/lib/python2.7/site-packages/mrjob/job.py", line 461, in run
            mr_job.execute()
          File "/var/cc-mrjob/venv/local/lib/python2.7/site-packages/mrjob/job.py", line 479, in execute
            super(MRJob, self).execute()
          File "/var/cc-mrjob/venv/local/lib/python2.7/site-packages/mrjob/launch.py", line 151, in execute
            self.run_job()
          File "/var/cc-mrjob/venv/local/lib/python2.7/site-packages/mrjob/launch.py", line 214, in run_job
            runner.run()
          File "/var/cc-mrjob/venv/local/lib/python2.7/site-packages/mrjob/runner.py", line 464, in run
            self._run()
          File "/var/cc-mrjob/venv/local/lib/python2.7/site-packages/mrjob/sim.py", line 173, in _run
            self._invoke_step(step_num, 'mapper')
          File "/var/cc-mrjob/venv/local/lib/python2.7/site-packages/mrjob/sim.py", line 264, in _invoke_step
            self.per_step_runner_finish(step_num)
          File "/var/cc-mrjob/venv/local/lib/python2.7/site-packages/mrjob/local.py", line 152, in per_step_runner_finish
            self._wait_for_process(proc_dict, step_num)
          File "/var/cc-mrjob/venv/local/lib/python2.7/site-packages/mrjob/local.py", line 268, in _wait_for_process
            (proc_dict['args'], returncode, ''.join(tb_lines)))
        Exception: Command ['sh', '-ex', 'setup-wrapper.sh', '/var/cc-mrjob/venv/bin/python', 'test.py', '--step-num=0', '--mapper', '/tmp/test.root.20150520.071726.549519/input_part-00000'] returned non-zero exit status 1:
        Traceback (most recent call last):
          File "test.py", line 46, in <module>
            TagGrabber.run()
          File "/tmp/test.root.20150520.071726.549519/job_local_dir/0/mapper/0/mrjob.tar.gz/mrjob/job.py", line 461, in run
            mr_job.execute()
          File "/tmp/test.root.20150520.071726.549519/job_local_dir/0/mapper/0/mrjob.tar.gz/mrjob/job.py", line 470, in execute
            self.run_mapper(self.options.step_num)
          File "/tmp/test.root.20150520.071726.549519/job_local_dir/0/mapper/0/mrjob.tar.gz/mrjob/job.py", line 535, in run_mapper
            for out_key, out_value in mapper(key, value) or ():
          File "/var/cc-mrjob/mrcc.py", line 33, in mapper
            for i, record in enumerate(f):
          File "/var/cc-mrjob/venv/local/lib/python2.7/site-packages/warc/warc.py", line 390, in __iter__
            record = self.read_record()
          File "/var/cc-mrjob/venv/local/lib/python2.7/site-packages/warc/warc.py", line 373, in read_record
            header = self.read_header(fileobj)
          File "/var/cc-mrjob/venv/local/lib/python2.7/site-packages/warc/warc.py", line 331, in read_header
            raise IOError("Bad version line: %r" % version_line)
        IOError: Bad version line: 'WARC/1.0\n'
    
  2. #1と同じですが、tailコマンドがあります

  3. #1 と同じですが、失われた改行または(キャリッジ リターン) 文字を置換するためにtrまたはの後に使用します。これにより、パッケージは、予想されるキャリッジ リターンまたは改行が配置されていないと不平を言い続けます。sed^Mwarc
  4. unix2dos oldfile
4

1 に答える 1

1

.warc ファイルにはバイナリ データも含まれている可能性があるため、改行を正しく処理することは困難です。たとえば、Python ライブラリは Content-Length ヘッダーが有効であることを信頼しているため、切り捨てによりおそらく破損した .warc ファイルも生成されます。

warc python lib は .warc ファイルから一度に 1 つのレコードのみを読み取ります (一度にファイル全体をメモリに読み取ることを回避します)。したがって、Python のみを使用してサブセットを処理することができます。例えば:

import warc
from itertools import islice

N = 10
warc_file = warc.open('/path/to/file.warc')
for record in islice(warc_file, N):
    do_stuff_with(record)
于 2015-05-21T10:07:00.457 に答える