Python 在不将整个文件加载到内存中的情况下,如何更改大型(60gig)csv文件的列名?
我正在尝试将来自《华盛顿邮报》的类鸦片数据(一个60 gig的csv)加载到MySQl中。问题是第一列的标题是空的(该列中的行有数字,只是没有标题),当我尝试使用表数据导入向导加载它时,MySQl在MySQl中给了我一个错误Python 在不将整个文件加载到内存中的情况下,如何更改大型(60gig)csv文件的列名?,python,mysql,database,csv,Python,Mysql,Database,Csv,我正在尝试将来自《华盛顿邮报》的类鸦片数据(一个60 gig的csv)加载到MySQl中。问题是第一列的标题是空的(该列中的行有数字,只是没有标题),当我尝试使用表数据导入向导加载它时,MySQl在MySQl中给了我一个错误 Starting... Prepare Import... Prepare Import done Import data file.... Traceback (most recent call last): File "/usr/share/mysql-workb
Starting...
Prepare Import...
Prepare Import done
Import data file....
Traceback (most recent call last):
File "/usr/share/mysql-workbench/libraries/workbench/wizard_progress_page_widget.py", line 192, in thread_work
self.func()
File "/usr/lib/mysql-workbench/modules/sqlide_power_import_wizard.py", line 125, in start_import
retval = self.module.start(self.stop)
File "/usr/lib/mysql-workbench/modules/sqlide_power_import_export_be.py", line 271, in start
ret = self.start_import()
File "/usr/lib/mysql-workbench/modules/sqlide_power_import_export_be.py", line 408, in start_import
if not self.prepare_new_table():
File "/usr/lib/mysql-workbench/modules/sqlide_power_import_export_be.py", line 237, in prepare_new_table
self._editor.executeManagementCommand(""" CREATE TABLE %s (%s)""" % (self._table_w_prefix, ", ".join(["`%s` %s" % (col['name'], col["type"]) for col in self._mapping])), 1)
DBError: ("Incorrect column name ''", 1166)
ERROR: Import data file: ("Incorrect column name ''", 1166)
Failed
正如您在底部看到的,错误是“”的列名不正确,它是空的列标题。但由于我无法在内存中加载整个60gig的csv,因此更改列名时遇到了问题
我想要的是能够编辑第一列,使其具有一些名称,如“Index”或“#”。任何让MySQL停止拒绝它的东西
我主要使用python,所以如果有人能给我一个用python修改列名的方法,我将非常感激。这是一个问题,我每隔几周就回来一次,但到目前为止还没有任何成功。你能给我的任何帮助都会很好
我记不起我试过什么了。我在这里搜索了一下,尝试了一些东西,但我始终找不到一个与我的问题完全匹配的解决方案
我想要的只是更改第一列的名称,这样当我将其加载到MySQl时,就不会出现错误。很抱歉,您这么长时间以来一直在努力解决这个问题 我同意Tim的观点,您的进口商可能有一个设置可以解决这个问题,但我们还是试着回答您的问题 首先,Python中有大量函数,允许您与文件交互,而无需将其全部加载到内存中 比如说
open(file)
简单地创建一个文件对象,理论上是您的文件,但实际上是(比如)对您的文件的引用
如果我是你,我会尝试read()和write()函数
继续: 假设您有一个名为“test.csv”的文件,其中包含以下数据:
test1,test2
a,b
然后,如果您想更改头并复制文件的其余部分,而不将其全部加载到内存中,则可以从该文件中读取一行并将其写入新文件
with open('old.csv') as f, open('new.csv', 'w') as g:
hdr = next(f)
hdr = 'idx' + hdr
g.write(hdr)
for line in f:
g.write(line)
INPUT\u FILENAME=“test.csv”
输出\u FILENAME=“test2.csv”
f=打开(输入文件名“r”)
firstline=f.readline()
打印(第一行)
#测试1,测试2\n
更改的\u firstline=firstline.replace(“test2”,“SomethingElse”)
打印(更改为第一行)
#测试1,某些东西\n
g=打开(“输出文件名”,“w”)
g、 写入(第一行)
尽管如此:
nextline=f.readline()
如果nextline='':
打破
其他:
a=g.write(f.readline())#“a=…”抑制标准输出
g、 关闭()
f、 关闭()
g=打开(输出文件名为“r”)
g、 readline()
#'test1,SomethingElse\na,b\n'
g、 关闭()
这在我的计算机上只花了几秒钟,文件大小为0.5Gb。希望它对你有用
请注意,上面的代码是受csv文件的启发编写的,但不同之处在于它是专门针对csv文件编写的 打开文件;读第一行;修改它;将其写入新文件;然后一次一行地读取其余的行,并将它们写入新文件
with open('old.csv') as f, open('new.csv', 'w') as g:
hdr = next(f)
hdr = 'idx' + hdr
g.write(hdr)
for line in f:
g.write(line)
理论上,任何一列都是空白的应该没有问题。CSV文件的标题是否可能缺少emtpy第一列的标签?是的,对不起,我的意思是该列的标题为空,该列不是完全空的,只是标题。我该如何检查和更正它?我现在正在尝试的是使用df.to_csv来尝试编写一个新的csv。我正在使用一个新的标题,我键入了有一个名字的第一列,并希望它的工作。你能解释一下你将如何用读写来解决这个问题吗?这不是答案。嘿,杰克,我补充了很多说明。希望有帮助!这解决了我的问题,但现在当我尝试将其加载到mySQl时,它表现为一切正常,然后什么也不加载。Givges没有错误,但表示已加载0行。但至少列名是固定的。谢谢。如果我们看到文件的前几行,可能会有所帮助。@guystales这个例子实际上是有效的。发现它没有加载是因为datetime有一些奇怪的东西。当我让它作为一个整数运行datetime时,它突然工作了,现在它正在加载我所有的数据,我为你感到高兴!我自己对这个代码印象深刻。它非常简洁。