Как перечислить значения словаря из двух ключей и вывести значения в txt файл с помощью Python?

Мои данные выглядят так, как показано ниже, и они находятся в файле excel с расширением xlsx, поэтому я использую библиотеку openpyxl для чтения файла в python и извлечения данных из строки 6 и далее для 2 столбцов, и я добавляю извлеченные данные в словарь с помощью ключи "Имя_столбца" и "Тип_столбца". Причина этого заключается в том, что я хотел бы добавить дополнительную строку между извлеченными данными. Строка, которую я хотел бы добавить, это CREATE TABLE TRANSIENT TABLE STG_EMPLOYEE();

Пока мой код и вывод выглядят так, как показано ниже. Мой ожидаемый вывод в txt-файле также упоминается ниже. Если вы заметили, я хотел бы перечислить значение обоих ключей одновременно, я не уверен, как это сделать в python, поэтому любая помощь приветствуется?

Заранее спасибо за ваше время и усилия!

Данные

File Name:  Employee
Sheet Name: Employee
File Type:  csv
    
Field Name  Type
Name    String
Salary  Numeric
Date    Date
Phone   Int

Код до сих пор

from openpyxl import load_workbook

data_file='\\test.xlsx'

# Load the entire workbook.
wb = load_workbook(data_file)
ws = wb['Employee'] #Access Sheet


outputFile = open('/output.txt', 'w')  # Text file Output
outputFile.write("CREATE TABLE TRANSIENT TABLE STG_EMPLOYEE({});".format(theString) + "\n")

mylines={"Column_name":[],"Column_Type":[]} #Getting 2 columns data from row 6

for i in range(6, ws.max_row+1):  
        name = ws.cell(row=i, column=1).value
        name1=ws.cell(row=i, column=2).value
        mylines["Column_name"].append(name) #Appending dictionary key "Column_name"
        mylines["Column_Type"].append(name1) #Appending dictionay key "Column_type"
        
theString = " "
# This relies on the lists 'Column_name' and 'Column_Type' always being the same length
# I.e., there should always be a value for each key
for i in range(len(mylines['Column_name'])):
    theString += mylines['Column_name'][i] + " " + mylines['Column_Type'][i]
    if i < ws.max_row:
        theString += ", "       


outputFile.close()

Вывод в текстовом файле с приведенным выше кодом:

CREATE TABLE TRANSIENT TABLE STG_EMPLOYEE([['Name', 'Salary', 'Date', 'Phone'], ['String', 'Numeric', 'Date', 'Int']]);

Ожидаемый вывод в файле Txt

   CREATE TABLE TRANSIENT TABLE STG_EMPLOYEE( Name String, Salary Numeric, Date Date, Phone Int);
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете воспользоваться тем фактом, что в списках "Column_name" и "Column_Type" всегда должно быть одинаковое количество элементов, чтобы свести задачу к итерации с использованием одной переменной:

# Simulated Excel Data
ws = {
    'max_row': 3,
    'cell': [
    ['Name', 'String'],
    ['Salary', 'Numeric'],
    ['Date', 'Date'],
    ['Phone', 'Int']
    ]
}

mylines={"Column_name":[],"Column_Type":[]}

for i in range(0, ws['max_row']+1):  
    name = ws['cell'][i][0]
    name1=ws['cell'][i][1]
    mylines["Column_name"].append(name)
    mylines["Column_Type"].append(name1)

theString = " "
# This relies on the lists 'Column_name' and 'Column_Type' always being the same length
# I.e., there should always be a value for each key
for i in range(len(mylines['Column_name'])):
    theString += mylines['Column_name'][i] + " " + mylines['Column_Type'][i]
    if i < ws['max_row']:
        theString += ", "

# OLD
print("CREATE TABLE TRANSIENT TABLE STG_EMPLOYEE({});".format([(mylines[k]) for k,v in mylines.items()]) + "\n")
# NEW
print("CREATE TABLE TRANSIENT TABLE STG_EMPLOYEE({});".format(theString) + "\n")

Когда я запустил это, я получил следующий вывод (первая строка из старой версии и вторая строка из новой версии):

CREATE TABLE TRANSIENT TABLE STG_EMPLOYEE([['Name', 'Salary', 'Date', 'Phone'], ['String', 'Numeric', 'Date', 'Int']]);

CREATE TABLE TRANSIENT TABLE STG_EMPLOYEE( Name String, Salary Numeric, Date Date, Phone Int);

Конечно, если в вашей электронной таблице есть фактические числовые и другие нестроковые данные, вы также захотите привести значения переменных к строкам, используя str(), прежде чем добавлять их к theString.

Единственное отличие от вашего кода (кроме изменений, которые я внес, чтобы код работал как автономный без фактической электронной таблицы), заключается в замене параметра format в последней строке строкой, созданной путем добавления значений из обоих списков в mylines.

Благодарю вас! Теперь единственная проблема, с которой я столкнулся, - это запятая в конце строки, т.е. Phone Int, чего я не хочу. Любой способ избавиться от этого?

biggboss2019 23.04.2022 16:47

Я не уверен, что могло бы вызвать это, так как у меня не было запятой в конце, когда я запускал код в ответе. Я думаю, что это связано с условием в операторе if, которое не оценивается как False, когда ожидалось. Предполагается, что оператор if определяет последнюю итерацию с помощью i < ws['max_row'] и добавляет запятую только каждый раз, когда кроме является последней итерацией.

Quack E. Duck 23.04.2022 17:15

Приходилось ли вам изменять синтаксис или условие в операторе if, чтобы вместить данные вашего листа Excel? Как это выглядит, когда вы в настоящее время используете его в своей программе?

Quack E. Duck 23.04.2022 17:16

Обновил мой код... извините, когда я перезапустил NB. Я получил «NameError: имя« theString »не определено» в outputFile.write(«CREATE TABLE TRANSIENT TABLE STG_EMPLOYEE({});».format(theString) + «\n»)

biggboss2019 23.04.2022 17:22

Может, попробовать перенести строки outputFile = open('/output.txt', 'w') # Text file OutputoutputFile.write("CREATE TABLE TRANSIENT TABLE STG_EMPLOYEE({});".format(theString) + "\n") в конец программы, прямо перед outputFile.close()?

Quack E. Duck 23.04.2022 17:43

Ошибка связана с тем, что ваша строка «запись в выходной файл» имеет ссылку на theString до инициализации theString. Кажется, что перемещение этого оператора после финального цикла for должно исправить это.

Quack E. Duck 23.04.2022 17:45

Эта ошибка исправлена. Благодарю вас! Все еще проблема с запятой

biggboss2019 23.04.2022 17:51

Хотя я не знаю, почему это происходит, вот простой способ исправить это: string1 = "abc def ghi,"string2 = string1[:len(string1) - 1]print(string2) просто возьмите строку с запятой в конце и нарежьте ее, чтобы удалить последний символ. Затем используйте новую строку внутри вашего оператора format.

Quack E. Duck 23.04.2022 17:57

Благодарю вас! что-то не так с моей средой или что-то еще .. разберусь. Большое спасибо за твою помощь!

biggboss2019 23.04.2022 18:09

Другие вопросы по теме