0

我想将一个 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可以同时读取和写入 (mode r+b),以便轻松复制临时文件内容。我假设filenameoutfilename具有相同的行数;如果他们不这样做,任何一个文件中的任何额外行都将被忽略。您可以使用itertools.izip_longest(),但您必须想出一个策略来决定在这种情况下为缺失的行填充什么。

您还需要避免\123在文件名中使用转义序列。使用正斜杠、原始字符串或双反斜杠:

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 回答