Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何减小Python创建的txt文件的大小?_Python_Pandas_Io_Pyodbc_Netezza - Fatal编程技术网

如何减小Python创建的txt文件的大小?

如何减小Python创建的txt文件的大小?,python,pandas,io,pyodbc,netezza,Python,Pandas,Io,Pyodbc,Netezza,我在Netezza服务器上的一个表中有大约2M行x70列的数字和分类数据,我想使用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 =

我在Netezza服务器上的一个表中有大约2M行x70列的数字和分类数据,我想使用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
现在谈谈尺寸: 熊猫方法创建了一个价值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,2.49,40.65,63.311249.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,2.49,40.65,63.311249.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,2.49,40.65,63.311249.92

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

我最后用以下方法删除了不必要的小数:

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

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

我本打算对此发表评论,但文本格式将有所帮助

我的猜测是你遇到了一个有引号和无引号的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”。在第二个示例中,很明显它实际上是一个值“423985.32”。这就是为什么您现在得到的引用格式(如果我是对的)更准确、更安全。

似乎您需要所有说明大小的说明。你能不能在事实之后压缩?我会怎么做?你考虑压缩方法吗?例如,您可以使用以下压缩方式之一:如何:好的,只是澄清一下:目前,我正在尝试找出是否有方法可以在不使用压缩的情况下减小文件大小。实际上,在SAS中编写CSV文件通常只会在需要它们的字段周围添加引号。因此,在您的示例中,只有最后一个字段具有引号,因为该值包含分隔符。如果Python在所有值(甚至只是所有字符值)周围添加引号,那么这就可以解释为什么SAS生成的文件会稍微小一些。啊,感谢Tom的澄清,我的SAS知识是顶针大小的。:)