Python 3中使用SQLite3写入数据库时出现磁盘I/O错误

15

我是一名刚开始学习Python的学生,我的任务是创建一个关系型数据库管理系统。我认为我已经做得很好了,但似乎遇到了难题。这是我的代码:

import csv
import sqlite3

conn = sqlite3.connect('unfccc.db')
c = conn.cursor()

c.execute('''CREATE TABLE unfccc (
        Country TEXT, 
        CodeCountryFormat TEXT, 
        NamePollutant TEXT, 
        NameYearSector TEXT, 
        NameParent TEXT, 
        Sector TEXT, 
        CodeSector TEXT, 
        CNUEDSPD TEXT
        )''')

def insert_row(Country, CodeCountryFormat, NamePollutant, NameYearSector, NameParent, Sector, CodeSector, CNUEDSPD):
    c.execute("INSERT INTO unfccc VALUES (?, ?, ?, ?, ?, ?, ?, ?)", (Country, CodeCountryFormat, NamePollutant, NameYearSector, NameParent, Sector, CodeSector, CNUEDSPD))
    conn.commit()

with open('UNFCCC_v20.csv') as csvfile:
    readCSV = csv.reader(csvfile, delimiter='\t')

    counter = 0

    for row in readCSV:
        insert_row(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7])
        counter = counter+1
        print('%d down, more to go' % counter)
conn.close()

当我使用第4行将输入指向:memory:时,它可以完美地运行,并且我认为自己拥有了一个关系型数据库。
但是,当我尝试像这样运行代码,将数据写入db文件时,我会得到这个错误:
 File "<ipython-input-13-4c50216842bc>", line 19, in insert_row
    c.execute("INSERT INTO unfccc VALUES (?, ?, ?, ?, ?, ?, ?, ?)", (Country, CodeCountryFormat, NamePollutant, NameYearSector, NameParent, Sector, CodeSector, CNUEDSPD))

OperationalError: disk I/O error

我在stackoverflow上进行了搜索,并使用了谷歌,但我认为我找到的任何情况都不符合我在这里尝试做的事情(或者我没有足够的知识来弄清楚发生了什么)。我注意到我的代码另外一个问题是,它将数据输入到内存中非常快,但当我写入到数据库文件时,速度非常慢,这不应该是硬件限制,因为我正在使用SSD。任何帮助将不胜感激!


你是在写入NFS吗?请参考此链接:link - Josh Dinsdale
看起来像是一个琐碎的问题,比如写入权限,尝试写入到你确定拥有写入权限的目录。 - Marco
6个回答

16

在使用存储在Google Drive上的项目时,将备份/同步设置暂停到系统托盘图标上可以防止磁盘I/O错误。

这是因为当文件被写入或更改时,备份和同步尝试将新版本上传到您的Google Drive,而在此过程中,该文件变成了“只读”文件。

暂停同步后,您的Google Drive文件夹的行为更像一个普通目录。

(点击->设置->暂停/恢复)


3
我遇到了一个类似的问题,使用Dropbox同步文件时操作出现了问题。暂停Dropbox同步解决了这个问题。 - chenware
1
@chenware - 我也是。我可以确认使用Dropbox时也会出现这个问题,这很有道理,因为它使用的过程与Google Drive大致相同。 - Pikamander2
我还没有得到答案:我有一个Python代码,每1分钟覆盖一次SQLite文件 - 我该如何解决这个错误? - krisskad
1
@krisskad 这个问题与文件的“读/写”权限有关。根据您的情况,您需要管理它。您的sqlite数据库文件在哪里?您的代码如何与它交互?在我能帮助您之前,需要更多信息。 - Owen Easter

4

这个问题的另一个原因是日志文件不可写,但SQLite数据文件可写。如果SQLite数据文件不可写,它会告诉您正在尝试向只读数据库写入。但是,如果数据库文件可写,但是日志文件(文件名与SQLite数据文件相同,但以-journal结尾)不可写,则会给出I / O错误。


2

我知道我可能回答得很晚,但是对于其他人来说...我遇到了同样的问题,我发现问题是一个Python代码已经在使用该数据库。当我停止那段代码并再次运行主代码时,它就可以正常工作了。


0

已经太晚回答了,但我在一个Python脚本中遇到了相同的错误。对我来说,只是在另一个程序中保存了一个数据库文件,其中我更新了数据。


0
不是你的问题,但是我在使用大写字母作为我的数据库文件名时遇到了一个错误。改了之后就解决了这个问题... 值得让其他人尝试一下!
sqlite3.connect('lowercase_name.db')

-2
答案很简单,我在我的个人电脑的Google Drive目录上工作时,当我遇到错误时处于离线状态,并且备份和同步程序没有运行,因此花了一段时间才意识到我仍然没有完全对该文件夹的权限。
将我的脚本和必要的文件移动到我的“文档”文件夹中可以解决这个错误。感谢Marco和Josh的帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接