【问题标题】:Using Python to Pull SQL info into CSV and it comes out blank使用 Python 将 SQL 信息拉入 CSV 并显示为空白
【发布时间】:2020-02-08 01:18:18
【问题描述】:

我有一个程序用来从我的站点中提取调查数据。我用 Python 编写了它,它将从 sql 数据库中获取信息,并将其下载到 csv 文件中。它工作得很好,但现在它只是一个没有信息且没有大小的空白 csv 文件。下面是我用于拉取的程序。我现在使用 python 3.7.4。

import pymysql.cursors
import csv

import sshtunnel
from sshtunnel import SSHTunnelForwarder

server = SSHTunnelForwarder(
    ('ADDRESS', PORT),
    ssh_username='USERNAME',
    ssh_password='PASS',
    remote_bind_address=('127.0.0.1', 3306)
)

server.start()


def find_number(result, number):
    if str(number) in result['p4'].split(','):
        return 1
    if str(number) in result['p3'].split(','):
        return 2
    if str(number) in result['p2'].split(','):
        return 3
    if str(number) in result['p1'].split(','):
        return 4
    if str(number) in result['z'].split(','):
        return 5
    if str(number) in result['n1'].split(','):
        return 6
    if str(number) in result['n2'].split(','):
        return 7
    if str(number) in result['n3'].split(','):
        return 8
    if str(number) in result['n4'].split(','):
        return 9
    return 'not found: ' + str(number)

# Connect to the database
conn = pymysql.connect(host='127.0.0.1',
                             user='USER',
                             password='PASS',
                             db='DBNAME',
                             charset='utf8mb4',
                       port=server.local_bind_port,
                             cursorclass=pymysql.cursors.DictCursor)

cursor = conn.cursor()


sql = "SELECT * FROM `surveys` order by id asc"
cursor.execute(sql)
results = cursor.fetchall()

output = {}
headers = []
comments = []

for result in results:
    headers.append(str(result['gender']) + '/' + str(result['birth_year']) + '/' + str(result['political_affiliation']) + '/' + str(result['religious_belief']) + '/' + str(result['ethnicity']) + '/' + str(result['location']))
    for nr in range(1, 37):
        if not nr in output:
            output[nr] = []
        nrr = find_number(result, nr)
        output[nr].append(nrr)
    comments.append(result['comments'])

writer = csv.writer(open("output5.csv", 'w', newline=''))
writer.writerow(headers)
for row in output:
    writer.writerow(output[row])
writer.writerow(comments)

conn.close()

【问题讨论】:

    标签: python mysql sql csv


    【解决方案1】:

    可能是 results 返回了一个错误的值,导致您的 for 循环被跳过。如果没有任何结果,您是否尝试过添加检查?

    ...
    results = cursor.fetchall()
    if not results:
       raise RuntimeException('Cannot retrieve records from Database!')
    

    另外,不确定你是否知道defaultdict,但你也可以在你的 sn-p 中使用它来简化一点。

    from collections import defaultdict
    ...
    output = defaultdict(list)
    for result in results:
     ...
     for nr in range(1, 37):
       output[nr].append(find_number(result, nr))
    

    【讨论】:

    • 我不知道默认字典,谢谢。那确实可以清理它。结果问题虽然没有发挥作用,但如果这有意义的话。 sql表中有数据,所以它不会通过异常或其他任何东西。它连接、断开和写入文件,但文件只是空白。
    猜你喜欢
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2013-01-12
    • 2022-08-03
    • 1970-01-01
    • 2017-05-19
    相关资源
    最近更新 更多