0

1 つの ASCII ファイルの最後の列を区切り、別の ASCII ファイルの末尾に追加したいと考えています。これまでのところ、次のコードを実行しましたが、うまくいくと思っていました。何が間違っているのかを見つけるのを手伝ってくれたらありがたいです。

import os,sys,csv

filename = 'E:\AirborneLidarData\IntensFirst\325115401.asc'
outfilename = 'E:\AirborneLidarData\LaserFirst\325115401.asc'

csv_out = csv.writer(open(outfilename, 'w'), delimiter=' ')

f = open(filename,'r')
for line in f:
   vals = line.split('\t')
   for item in csv_out:
      csv_out.writerow(item.strip() , vals[3])

これは、両方のデータセットの 5 行のみの例です。

ファイル内:

32511999.00 5401190.00   18.00
32511999.50 5401190.00   18.00
32511998.50 5401190.50   15.00
32511999.00 5401190.50   16.50
32511999.50 5401190.50   17.62

出力ファイル:

32511999.00 5401190.00  313.98  
32511999.50 5401190.00  313.98  
32511998.50 5401190.50  314.10  
32511999.00 5401190.50  314.04  
32511999.50 5401190.50  313.99  
4

1 に答える 1

0

最初に両方の入力ファイルをループして、行を結合し、一時ファイルに書き出す必要があります。次に、一時ファイルを目的の出力ファイルに戻します。実際には CSV データではなく、任意の数のスペースを区切り文字として使用するデータです。手動で処理する必要がありますが、csv モジュールを使用して書き出します。

import csv
import tempfile
import shutil
from itertools import izip

with open(filename, 'rb') as infile1, open(outfilename, 'r+b') as infile2:
    outfile = tempfile.TemporaryFile()
    outcsv = csv.writer(outfile, delimiter=' ')

    for line1, line2 in izip(infile1, infile2):
        row1, row2 = line1.split(), line2.split()
        outcsv.writerow(row2 + [row1[2]])

    # rewind files to start; alternative is to close both and use `shutil.copyfile()`
    outfile.seek(0)
    infile2.seek(0)
    shutil.copyfileobj(outfile, infile2)
    outfile.close()

上記のコードは、一時ファイルの内容を簡単にコピーして戻すoutfilenameために、読み取りと書き込み (モード) の両方で開きます。との行数は同じであるとr+b想定しています。そうでない場合、いずれかのファイルの余分な行は無視されます。を使用できますが、その場合、欠落している行に何を埋めるかを決定する戦略を考え出す必要があります。filenameoutfilenameitertools.izip_longest()

\123また、ファイル名にエスケープ シーケンスを使用しないようにする必要があります。スラッシュ、生の文字列、またはバックスラッシュを 2 つ使用します。

filename = 'E:\\AirborneLidarData\\IntensFirst\\325115401.asc'
outfilename = 'E:\\AirborneLidarData\\LaserFirst\\325115401.asc'

また

filename = r'E:\AirborneLidarData\IntensFirst\325115401.asc'
outfilename = r'E:\AirborneLidarData\LaserFirst\325115401.asc'

また

filename = 'E:/AirborneLidarData/IntensFirst/325115401.asc'
outfilename = 'E:/AirborneLidarData/LaserFirst/325115401.asc'

バックスラッシュがエスケープシーケンスとして解釈されるのを避けるため、すべて機能します。

于 2013-05-13T15:11:54.657 に答える