我想将一个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
答案 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
,以便于复制临时文件内容。我假设filename
和outfilename
具有相同的行数;如果他们不这样做,任何文件中的任何额外行都将被忽略。您可以使用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'
将全部起作用,因为它们避免将反斜杠解释为转义序列。