Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.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 在不将整个文件加载到内存中的情况下,如何更改大型(60gig)csv文件的列名?_Python_Mysql_Database_Csv - Fatal编程技术网

Python 在不将整个文件加载到内存中的情况下,如何更改大型(60gig)csv文件的列名?

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

我正在尝试将来自《华盛顿邮报》的类鸦片数据(一个60 gig的csv)加载到MySQl中。问题是第一列的标题是空的(该列中的行有数字,只是没有标题),当我尝试使用表数据导入向导加载它时,MySQl在MySQl中给了我一个错误

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时,它突然工作了,现在它正在加载我所有的数据,我为你感到高兴!我自己对这个代码印象深刻。它非常简洁。