У меня есть программа, которую я использую для получения данных опроса с моего сайта. Я написал его на 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()

1
Kubes 10 Окт 2019 в 17:42

1 ответ

Возможно, results возвращает ложное значение, что приводит к пропуску цикла for. Вы пытались добавить проверку, если нет никаких результатов?

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

Кроме того, не уверен, что вы знаете о defaultdict, но вы могли бы также используйте его в своем фрагменте, чтобы немного упростить.

from collections import defaultdict
...
output = defaultdict(list)
for result in results:
 ...
 for nr in range(1, 37):
   output[nr].append(find_number(result, nr))
1
PygoNode 10 Окт 2019 в 18:09
Я не знал, что такое defualtdict, спасибо. Это убирает. Однако проблема с результатами не проходит, если в этом есть смысл. В таблице sql есть данные, поэтому они не связаны с исключением или чем-то еще. Он подключается, отключается и записывает файл, но файл остается пустым.
 – 
Kubes
10 Окт 2019 в 19:03