【问题标题】:How to reduce the size of a txt file created by Python?如何减小 Python 创建的 txt 文件的大小?
【发布时间】:2015-12-20 22:28:56
【问题描述】:

我在 Netezza 服务器上的表中有大约 2M 行 x 70 列的数值和分类数据,我想使用 Python 将其转储到 .txt 文件中。 我过去用 SAS 做过这个,在我的测试用例中,我得到了一个价值 450MB 的 txt 文件。 我使用 Python 并尝试了几件事。

# One line at a time

startTime = datetime.datetime.now().replace(microsecond=0)

cnxn = pyodbc.connect('DSN=NZ_LAB')
cursor = cnxn.cursor()
c = cursor.execute("""SELECT * FROM MYTABLE""")

with open('dump_test_pyodbc.csv','wb') as csv:
    csv.write(','.join([g[0] for g in c.description])+'\n')
    while 1:
        a=c.fetchone()
        if not a:
            break
        csv.write(','.join([str(g) for g in a])+'\n')
cnxn.close()

endTime = datetime.datetime.now().replace(microsecond=0)
print "Time elapsed PYODBC:", endTime - startTime

>>Time elapsed PYODBC: 0:18:20



# Use Pandas chunksize
startTime = datetime.datetime.now().replace(microsecond=0)
cnxn = pyodbc.connect('DSN=NZ_LAB')

sql = ("""SELECT * FROM MYTABLE""")

df = psql.read_sql(sql, cnxn, chunksize=1000)

for k, chunk in enumerate(df):
    if k == 0:
        chunk.to_csv('dump_chunk.csv',index=False,mode='w')
    else:
        chunk.to_csv('dump_chunk.csv',index=False,mode='a',header=False)

endTime = datetime.datetime.now().replace(microsecond=0)
print "Time elapsed PANDAS:", endTime - startTime
cnxn.close()

>>Time elapsed PANDAS: 0:29:29

现在大小: Pandas 方法创建了一个 690MB 的文件,另一种方法创建了一个 630MB 的文件。 速度和尺寸似乎有利于前一种方法,但是,从尺寸上看,这仍然比原始的 SAS 方法大得多。 关于如何改进 Python 方法以减小输出大小的任何想法?

编辑:添加示例--------------------

好的,看起来 SAS 在管理整数方面做得更好,这是有道理的。我认为这是造成尺寸差异的主要原因。

SAS: xxxxxx,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2.49,40.65,63.31,1249.92。 ..

熊猫: xxxxxx,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,2.49,40.65,63.31,1249.92. ..

fetchone(): xxxxxx,0.00,0.00,0,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,2.49,40.65,63.31,1249.92. ..

编辑 2:解决方案------------------------------------

我最终删除了不必要的小数:

csv.write(','.join([str(g.strip()) if type(g)==str else '%g'%(g) for g in a])+'\n')

这将文件大小降低到 SAS 级别。

【问题讨论】:

  • 看来你需要所有说明尺寸的描述。事后可以不压缩吗?
  • 我该怎么做?
  • 您考虑压缩方法吗?例如,您可以使用以下压缩方式之一:link
  • 好的,澄清一下:目前,我正在尝试弄清楚是否有办法在不使用压缩的情况下减小文件大小。

标签: python pandas io pyodbc netezza


【解决方案1】:

我打算将此作为评论,但文本格式会有所帮助。

我的猜测是您遇到了引用与未引用 CSV 文件的问题。 SAS 可以选择创建不带引号的 CSV 文件。这是一个例子:

This Value,That Value,3,Other Value,423,985.32

我认为您获得的文件更准确,不会对带有逗号的字段造成问题。同一行,引用:

"This Value","That Value","3","Other Value","423,985.32"

如您所见,在第一个 (SAS) 示例中,如果读入电子表格,它将读取为两个不同的值,“423”和“985.32”。在第二个示例中,很明显它实际上是一个值“423,985.32”。这就是为什么您现在得到的引用格式(如果我是对的)更加准确和安全。

【讨论】:

  • 实际上在 SAS 中编写 CSV 文件通常只会在需要它们的字段周围添加引号。因此,在您的示例中,只有最后一个字段会有引号,因为该值包含分隔符。如果 Python 在所有值(甚至只是所有字符值)周围添加引号,那么这可以解释为什么 SAS 生成的文件略小。
  • 啊,谢谢汤姆的澄清,我的 SAS 知识是顶针大小的。 :)
猜你喜欢
  • 2015-10-12
  • 2021-04-06
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
相关资源
最近更新 更多