寻找更好的方法来创建文件的编辑副本

时间:2019-05-05 09:23:29

标签: python

我已经下载了英国慈善委员会的数据,这些数据以多个BCP文件的形式提供。我想为每个文件创建一个新的CSV文件,其中包含数据的干净副本。我有一个可行的解决方案,但我怀疑还有更好的方法。

首先要注意的是,它并不像将BCP文件读入带有适当定界符和行终止符的pandas CSV阅读器那样简单。 BCP文件的基础文本文件包含换行符,这会使CSV阅读器感到困惑。需要删除这些以获取正确的结果。

此外,由于定界符为@**@,行终止符为*@@*,并且由于有许多空字段,因此在文件中有一对彼此相邻的定界符并不罕见。可以读取为行终止符。

def bcp_converter(bcp_file, columns):
    with open(bcp_file, 'r', encoding='Latin-1') as bcpfile:
        with open(bcp_file[:-4] + '.csv', 'w+', encoding='Latin-1') as csvfile:
            csvwriter = csv.writer(csvfile, delimiter=',')
            csvwriter.writerow(columns)
            temp_line = ''
            for line in bcpfile:
                temp_line = temp_line + (line.replace('\n', '')
                                         .replace('\r', '')
                                         .replace('
', '')
                                         .replace('\x07\t', '')
                                         .replace('@**@','%%')
                                         .replace('*@@*', '\n'))

                csv_data = [[string.strip() for string in item.split('%%')] for item in temp_line.split('\n')[:-1]]

                temp_line = temp_line.split('\n')[-1] + ' '

                for i in range(len(csv_data)):
                    csvwriter.writerow(csv_data[i])

        csvfile.close()

此代码有效,并且运行速度不是很慢(在PC上大约需要1分钟30来转换约700MB的数据),但是我怀疑有一些方法可以使它变得更好。

作为旁注,在GitHub-https://github.com/ncvo/charity-commission-extract/上有一个公开可用的转换器。但是,尽管这样做工作得相当不错,但确实会犯一些错误(在某些情况下,传真列最终包含的字符串显然不是传真,并且试图将regno列设置为int值在熊猫中失败了)。这就是我决定自己写的原因。

0 个答案:

没有答案