使用python删除从hive查询输出中打印的空行

时间:2014-06-13 00:54:43

标签: python mysql hadoop hive

我正在执行配置单元查询并将输出存储在本地FS中的tsv文件中。我正在为hive查询运行for循环并传递不同的参数。如果hive查询在for循环中没有返回一次输出,则在tsv文件中打印一个空行。这会导致NULL值被推送到后端的DB。因此,在for循环运行并创建文件后 - 我有以下代码删除所有打印的空行,但它不起作用。

如何从此文件中删除空行?

` 395.9   429.61  PT  
                       `

代码:

with open('file.tsv','r+w') as file:
        for line in file:
          if line.strip():
            file.write(line)

感谢

1 个答案:

答案 0 :(得分:0)

通常你会打开输入文件并将非空行写入第二个文件:

with open('file.tsv') as infile, open('filtered_file.tsv', 'w') as outfile:
    for line in infile:
        if line.strip():
            outfile.write(line)

如果您要在原地过滤文件,可以使用FileInput inplace选项:

import fileinput
for line in fileinput.FileInput("infile", inplace=1):
    if line.strip():
        print line

但是,这使用了一个中间文件,可能无法在低磁盘空间情况下工作。

要在不分配任何额外磁盘空间的情况下过滤文件,您可以尝试以下方法:

with open('file.tsv', 'r+') as infile:
    read_pos = write_pos = 0
    line = infile.readline()
    while line:
        read_pos += len(line)
        if line.strip():
            infile.seek(write_pos)
            infile.write(line)
            write_pos += len(line)
        infile.seek(read_pos)
        line = infile.readline()
    # update file size to the new, possibly reduced, size
    infile.truncate(write_pos)