Я пытаюсь выяснить, как извлекать данные из таблицы с столбцом, который называется sent_time, а время datetime - между двумя датами. Наконец, я смог выяснить, как использовать синтаксический анализатор dateutil, чтобы иметь возможность вводить две даты для диапазона дат. Моя проблема сейчас в том, что я получаю эту ошибку:Путь к дате в MySQL с использованием Python: TypeError: unhashable type: 'bytearray'
Traceback (most recent call last):
File "C:\Python34\timerange.py", line 75, in <module>
worksheet.write(r,0,row[0])
File "C:\Python34\lib\site-packages\xlsxwriter\worksheet.py", line 64, in cell_wrapper
return method(self, *args, **kwargs)
File "C:\Python34\lib\site-packages\xlsxwriter\worksheet.py", line 436, in write
return self.write_string(row, col, *args)
File "C:\Python34\lib\site-packages\xlsxwriter\worksheet.py", line 64, in cell_wrapper
return method(self, *args, **kwargs)
File "C:\Python34\lib\site-packages\xlsxwriter\worksheet.py", line 470, in write_string
string_index = self.str_table._get_shared_string_index(string)
File "C:\Python34\lib\site-packages\xlsxwriter\sharedstrings.py", line 128, in _get_shared_string_index
if string not in self.string_table:
TypeError: unhashable type: 'bytearray'
Это ByteArray, который заставил меня озадачило. Не могли бы вы, ребята, сказать мне, что я делаю неправильно, и как я могу это исправить?
Я хочу дать вам всю информацию, которую я со всеми другими файлами и что я съемки для того чтобы увидеть если вы можете повторить и на самом деле получить его работу только чтобы увидеть, если это не только моя система или некоторые настройки у меня есть ..
у меня есть база данных с одним table.Lets называют его «table1» таблица разбита с колоннами, как это:
sent_time | deliver_time | id1_active | id2_active | id3_active | id1_inactive | id2_inactive | id3_inactive | location_active | location_inactive ... ..`lots more
Допустим, что это два или более клиентов, доставляющих товары друг другу и друг от друга. У каждого клиента три идентификатора.
Я создал 'config.ini' файл, чтобы сделать свою жизнь немного легче
[mysql]
host = localhost
database = db_name
user = root
password = blahblah
Я создал '' python_mysql_dbconfig.py
from configparser import ConfigParser
def read_db_config(filename=’config.ini’, section=’mysql’):
“”” Read database configuration file and return a dictionary object
:param filename: name of the configuration file
:param section: section of database configuration
:return: a dictionary of database parameters
“””
# create parser and read ini configuration file
parser = ConfigParser()
parser.read(filename)
# get section, default to mysql
db = {}
if parser.has_section(section):
items = parser.items(section)
for item in items:
db[item[0]] = item[1]
else:
raise Exception(‘{0} not found in the {1} file’.format(section, filename))
return db
Это код, который Я сейчас работаю ... не могли бы вы взглянуть?
# Establish a MySQL connection
from mysql.connector import MySQLConnection, Error
from python_mysql_dbconfig import read_db_config
db_config = read_db_config()
conn = MySQLConnection(**db_config)
cursor = conn.cursor(raw=True)
#to export to excel
import xlsxwriter
from xlsxwriter.workbook import Workbook
#to get the csv converter functions
import os
import subprocess
import glob
#to get the datetime functions
import datetime
from datetime import datetime
import dateutil.parser
#creates the path needed for output files
path = 'C:/Python34/output_files/'
#creates the workbook
output_filename = input('output filename:')
workbook = xlsxwriter.Workbook(path + output_filename + '.xlsx')
worksheet = workbook.add_worksheet()
#formatting definitions
bold = workbook.add_format({'bold': True})
date_format = workbook.add_format({'num_format': 'yyyy-mm-dd hh:mm:ss'})
timeShape = '%Y-%m-%d %H:%M:%S'
#actual query
query = (
"SELECT sent_time, delivered_time, OBJ, id1_active, id2_active, id3_active, id1_inactive, id2_inactive, id3_inactive, location_active, location_inactive FROM table1 "
"WHERE sent_time BETWEEN %s AND %s"
)
userIn = dateutil.parser.parse(input('start date:'))
userEnd = dateutil.parser.parse(input('end date:'))
# Execute sql Query
cursor.execute(query,(userIn, userEnd))
result = cursor.fetchall()
#sets up the header row
worksheet.write('A1','sent_time',bold)
worksheet.write('B1', 'delivered_time',bold)
worksheet.write('C1', 'customer_name',bold)
worksheet.write('D1', 'id1_active',bold)
worksheet.write('E1', 'id2_active',bold)
worksheet.write('F1', 'id3_active',bold)
worksheet.write('G1', 'id1_inactive',bold)
worksheet.write('H1', 'id2_inactive',bold)
worksheet.write('I1', 'id3_inactive',bold)
worksheet.write('J1', 'location_active',bold)
worksheet.write('K1', 'location_inactive',bold)
worksheet.autofilter('A1:K1') #dropdown menu created for filtering
#print into client to see that you have results
print(" sent_time ", " delivered_time ", "OBJ", "\t id1_active ", " id2_active ", " id3_active ", "\t", " id1_inactive ", " id2_inactive ", " id3_inactive ", "\tlocation_active", "\tlocation_inactive")
for row in result:
print(*row, sep='\t')
# Create a For loop to iterate through each row in the XLS file, starting at row 2 to skip the headers
for r, row in enumerate(result, start=1): #where you want to start printing results inside workbook
for c, col in enumerate(row):
worksheet.write_datetime(r,0,row[0], date_format)
worksheet.write_datetime(r,1, row[1], date_format)
worksheet.write(r,2, row[2])
worksheet.write(r,3, row[3])
worksheet.write(r,4, row[4])
worksheet.write(r,5, row[5])
worksheet.write(r,6, row[6])
worksheet.write(r,7, row[7])
worksheet.write(r,8, row[8])
worksheet.write(r,9, row[9])
worksheet.write(r,10, row[10])
#close out everything and save
cursor.close()
workbook.close()
conn.close()
#print number of rows and bye-bye message
print ("- - - - - - - - - - - - -")
rows = len(result)
print ("I just imported "+ str(rows) + " rows from MySQL!")
print ("")
print ("Good to Go!!!")
print ("")
#CONVERTS JUST CREATED FILE TO CSV
# set path to folder containing xlsx files
out_path ='C:/Python34/csv_files'
os.chdir(path)
# find the file with extension .xlsx
xlsx = glob.glob(output_filename + '.xlsx')
# create output filenames with extension .csv
csvs = [x.replace('.xlsx','.csv') for x in xlsx]
# zip into a list of tuples
in_out = zip(xlsx,csvs)
# loop through each file, calling the in2csv utility from subprocess
for xl,csv in in_out:
out = open(csv,'w')
command = 'c:/python34/scripts/in2csv %s\\%s' % (path,xl)
proc = subprocess.Popen(command,stdout=out)
proc.wait()
out.close()
print('XLSX and CSV files named ' + output_filename + ' were created')
Здесь слишком много кода и несвязанных деталей. Вам нужно посмотреть типы в этих аргументах - 'workheet.write (r, 0, row [0])'. и узнайте, почему драйвер db сопоставляет что-то из вашей таблицы с bytearray, а не с строкой (если это то, что на самом деле происходит) – pvg
Я дал весь свой код, чтобы увидеть, хочет ли кто-то повторить то, что я делаю, чтобы увидеть, что я делаю неправильно. Я знаю, что отключает мой код, это входы userIn и UserEnd, которые я использовал dateutil.parser.parse. Я пытаюсь понять, как преобразовать его обратно в строку на рабочем листе.write (r, 0, row [0]) – Daniel
, если вы хотите, чтобы кто-то реплицировал проблему, вы это не сбрасываете весь свой код. http://stackoverflow.com/help/mcve Но вы должны заглядывать в то, почему вы получаете вместо него строку bytearray, а не строку. Типы столбцов в mysql могут иметь к этому какое-то отношение. – pvg