【问题标题】:Exporting CSV file from python sqlite3 [duplicate]从python sqlite3导出CSV文件[重复]
【发布时间】:2016-07-11 08:48:05
【问题描述】:

我已经尝试 google 了好几个小时了,如果答案已经出来了,抱歉

这是我目前所拥有的:

c.execute("SELECT * FROM table")
table = c.fetchall()
print(table)

#to export as csv file
with open("wub.csv", "wb") as write_file:
     cursor = connection.cursor()
          for row in cursor.execute("SELECT * FROM table"):
          write_file.write(row)

但我不断收到错误消息:

Traceback (most recent call last):
  File "C:/Users/Rachel/Documents/database.py", line 52, in <module>
    write_file.write(row)
TypeError: a bytes-like object is required, not 'tuple'

所以我很确定我做错了 - 我如何正确地将表格导出到外部 CSV 文件?谢谢

编辑: to Janekmuric

【问题讨论】:

  • write_file.write(",".join(row)) 修复了吗?也许write_file.write(",".join(row) + "\n") 以防它不自动添加换行符。无论如何,正如@cricket_007 的链接所暗示的,还有一个用于处理 csv 文件的模块
  • 警告:如果您使用 Python3,并且仍想以二进制模式编写 .cvs 文件,则必须将从 sqlite 光标返回的字符串编码为字节。

标签: python csv sqlite


【解决方案1】:
import sqlite3
import csv

inpsql3 = sqlite3.connect('input.sql3')
sql3_cursor = inpsql3.cursor()
sql3_cursor.execute('SELECT * FROM clients')
with open('output.csv','w') as out_csv_file:
  csv_out = csv.writer(out_csv_file)
  # write header                        
  csv_out.writerow([d[0] for d in sql3_cursor.description])
  # write data                          
  for result in sql3_cursor:
    csv_out.writerow(result)
inpsql3.close()

注意使用 sql 游标的description 成员来获取clients 表中标题的名称。

当然,您可以修改输入和输出文件的名称。并且还可以修改csv.writer的参数。

原作者有用于写入字节的标志'wb';但是我们不是在写字节。

【讨论】:

    【解决方案2】:

    下面的代码将遍历SELECT (execute) 返回的元组列表。

    for row in cursor.execute("SELECT * FROM table"):
          write_file.write(row)
    

    例如。
    如果您有一个包含行 numberwordcolour 的数据库,您的代码将循环如下:

    (23, "tree", "red")
    (17, "code", "green")
    (11, "python", "yellow")
    

    而您要做的是将 tuple 写入文件。您只能将字符串(或bytes)写入文件。

    您要做的就是将该元组转换为字符串。为此,您可以使用join() 函数。

    您的代码现在将如下所示:

    c.execute("SELECT * FROM table")
    table = c.fetchall()
    print(table)
    
    #to export as csv file
    with open("wub.csv", "wb") as write_file:
         cursor = connection.cursor()
         for row in cursor.execute("SELECT * FROM table"):
              writeRow = " ".join(row)
              write_file.write(writeRow)
    

    " ".join(row) 将连接所有元组元素并用空格分隔它们。


    这有一些问题。

    Join 仅适用于仅包含字符串元素的列表和元组(因此,如果您的数据库具有 REALINTEGER 类型,则上面的代码将不起作用)

    您可以编写一个循环遍历列表中的每个元素并将其转换为字符串。

    我还添加了.encode(),因为您正在使用"rb" 打开您的CSV 文件,因此您需要在写入文件之前将其转换为bytes

    c.execute("SELECT * FROM table")
    table = c.fetchall()
    print(table)
    
    #to export as csv file
    with open("wub.csv", "wb") as write_file:
        cursor = connection.cursor()
        for row in cursor.execute("SELECT * FROM table"):
            writeRow = " ".join([str(i) for i in row])
            write_file.write(writeRow.encode())
    

    【讨论】:

    • 非常感谢您的回复 - 这很有效,但我的表格有不止一种“字段类型”(不太确定如何描述它),并且 CSV 文件将所有数据放入一个字段(我将在屏幕截图中编辑问题部分) - 有没有办法让一个表格字段分配一个 excel 字段,并且每个条目位于不同的行上?
    • @Rachel 我不确定你在问什么。如果您可以上传整个代码并添加有关您需要的更多详细信息,那就太好了。您也可以将此答案标记为已接受并发布一个新问题。
    • 为什么在 open() 中使用“wb”标志?它是一个文本文件...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 2019-02-23
    • 2020-08-23
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    相关资源
    最近更新 更多