写入数据库时 Python 3 中 SQLite3 的磁盘 I/O 错误
disk I/O error with SQLite3 in Python 3 when writing to a database
我是一名刚开始学习 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: 时,它工作得很好,我自己拥有我认为是关系数据库的东西。
然而,当我尝试 运行 这样的代码,将数据写入数据库文件时,我得到了这个错误:
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
我已经搜索了 Whosebug,并且我已经使用了 google,但我认为我发现的任何案例都不符合我在这里尝试做的事情(或者我不不知道发生了什么事)。关于我的代码,我注意到的另一件事是它以超快的速度将数据输入内存,但是当我写入 db 文件时它真的很慢,这不应该是硬件限制,因为我使用的是 SSD。任何帮助将不胜感激!
答案很简单,我在我个人电脑上的 Google Drive 目录中工作,错误发生时我处于离线状态,因此备份和同步程序不是 运行我花了一段时间才意识到我仍然没有对该文件夹的完全权限。
将我的脚本和必要的文件移动到我的文档中的文件夹修复了错误。感谢 Marco 和 Josh 的帮助!
设置 Backup/Sync 在处理存储在 Google 驱动器上的项目时在系统托盘图标上暂停将防止磁盘 i/o 错误。
这是因为当文件被写入或更改时,备份与同步会尝试将新版本上传到您的 Google 驱动器,同时这样做;文件变为 'Read-Only' 文件。
同步暂停时,您的 Google Drive 文件夹更像一个普通目录。
(点击 -> 设置 -> pause/resume)
导致此问题的另一个原因是日志文件不可写,但 SQLite 数据文件可写。如果 SQLite 数据文件不可写,它会告诉您您正在尝试写入只读数据库。但是如果数据库文件是可写的,但是日志文件(文件名与 SQLite 数据文件相同,但以 -journal 结尾)不可写,它会给你一个 I/O 错误。
这不是你的问题,但我在我的数据库文件名中使用大写字符时遇到错误。更改并解决了这个问题...值得其他人尝试!
sqlite3.connect('lowercase_name.db')
我知道我可能会很晚才回答,但对于其他人...我遇到了同样的问题,我发现的问题是 python 代码已经在使用该数据库。当我停止代码并再次 运行 主代码时,它确实起作用了..
我是一名刚开始学习 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: 时,它工作得很好,我自己拥有我认为是关系数据库的东西。
然而,当我尝试 运行 这样的代码,将数据写入数据库文件时,我得到了这个错误:
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
我已经搜索了 Whosebug,并且我已经使用了 google,但我认为我发现的任何案例都不符合我在这里尝试做的事情(或者我不不知道发生了什么事)。关于我的代码,我注意到的另一件事是它以超快的速度将数据输入内存,但是当我写入 db 文件时它真的很慢,这不应该是硬件限制,因为我使用的是 SSD。任何帮助将不胜感激!
答案很简单,我在我个人电脑上的 Google Drive 目录中工作,错误发生时我处于离线状态,因此备份和同步程序不是 运行我花了一段时间才意识到我仍然没有对该文件夹的完全权限。
将我的脚本和必要的文件移动到我的文档中的文件夹修复了错误。感谢 Marco 和 Josh 的帮助!
设置 Backup/Sync 在处理存储在 Google 驱动器上的项目时在系统托盘图标上暂停将防止磁盘 i/o 错误。
这是因为当文件被写入或更改时,备份与同步会尝试将新版本上传到您的 Google 驱动器,同时这样做;文件变为 'Read-Only' 文件。
同步暂停时,您的 Google Drive 文件夹更像一个普通目录。
(点击 -> 设置 -> pause/resume)
导致此问题的另一个原因是日志文件不可写,但 SQLite 数据文件可写。如果 SQLite 数据文件不可写,它会告诉您您正在尝试写入只读数据库。但是如果数据库文件是可写的,但是日志文件(文件名与 SQLite 数据文件相同,但以 -journal 结尾)不可写,它会给你一个 I/O 错误。
这不是你的问题,但我在我的数据库文件名中使用大写字符时遇到错误。更改并解决了这个问题...值得其他人尝试!
sqlite3.connect('lowercase_name.db')
我知道我可能会很晚才回答,但对于其他人...我遇到了同样的问题,我发现的问题是 python 代码已经在使用该数据库。当我停止代码并再次 运行 主代码时,它确实起作用了..