如何分离一个ASCII文件的列并将其添加到Python中另一个ASCII文件的最后一列?

时间:2013-05-13 14:50:26

标签: python csv

我想将一个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行的示例。

infile:

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

OUTFILE:

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  

1 个答案:

答案 0 :(得分: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,以便于复制临时文件内容。我假设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'

将全部起作用,因为它们避免将反斜杠解释为转义序列。