Добавить новую строку для каждого дубликата в слове do c, используя Python и Mailmerge - PullRequest
0 голосов
/ 01 апреля 2020

Доброе утро, все,

Я написал скрипт, который заполняет букву в текстовом документе несколькими полями (отправка в #, серийный номер и т. Д. c.) И создает новый текстовый документ для каждой строки в мой список адресов, который содержит номер судна, серийный номер и имя клиента. Мой код выводит все 2000 букв для каждой записи в моем списке адресов. Однако один клиент может иметь несколько серийных номеров и, следовательно, может иметь несколько записей в списке адресов. Текущий код печатает несколько букв для одного и того же клиента для каждой отдельной строки / серийного номера.

Как добавить строку для каждого отдельного серийного номера # в одну и ту же букву вместо нескольких букв для одного и того же клиента для каждого отдельного серийного номера? В настоящее время я пытаюсь создать словарь с повторяющимися именами клиентов и соответствующими им серийными номерами, а затем использовать этот словарь в mailmerge, но все еще не уверен, как. Любые советы или рекомендации приветствуются.

РЕДАКТИРОВАТЬ1: когда я пытаюсь проанализировать дубликаты, используя этот print ([item for item, count in collections.Counter(dict_list).items() if count > 1]), я получаю сообщение об ошибке: unhashable type: 'dict'.

from __future__ import print_function
from xlrd import open_workbook
from mailmerge import MailMerge
import pandas as pd
import numpy as np
import operator
import itertools



#####################address list template            
book = open_workbook('Template3.xlsx')
sheet = book.sheet_by_index(0)

keys = [sheet.cell(0, col_index).value for col_index in range(sheet.ncols)]

dict_list = []
for row_index in range(1, sheet.nrows):
    d = {keys[col_index]: sheet.cell(row_index, col_index).value 
        for col_index in range(sheet.ncols)}
    dict_list.append(d)

###################serial number template  
book = open_workbook('serialtemp1.xlsx')
sheet = book.sheet_by_index(0)

serialkeys = [sheet.cell(0, col_index).value for col_index in range(sheet.ncols)]

serial_list = []
for row_index in range(1, sheet.nrows):
    d1 = {serialkeys[col_index]: sheet.cell(row_index, col_index).value 
        for col_index in range(sheet.ncols)}
    serial_list.append(d1)          

#serialized = map(tuple, map(sorted, map(dict.items, serial_list)))
#unique = set(serialized)
#result = list(map(dict, unique))

#print(serial_list)

######################new dict with serial as keys
key = operator.itemgetter('Ship To')
b = [{'Ship To': x, 'serial_number': str({d1['serial_number'] for d1 in y})} 
     for x, y in itertools.groupby(sorted(serial_list, key=key), key=key)]



###################create pandas df for serial list
pdframe1 = pd.DataFrame(b)

pdframe1.sort_values(by=['Ship To'])
pdframe1['serial_number']=pdframe1['serial_number'].str.replace(r"\{","")
pdframe1['serial_number']=pdframe1['serial_number'].str.replace(r"\'","")
pdframe1['serial_number']=pdframe1['serial_number'].str.replace(r"\}","")
pdframe1['Ship To'] = pdframe1['Ship To'].astype(np.int64)
pdframe1['serial_number'] = pdframe1['serial_number'].astype(str).replace('\.0', '', regex=True)

##############################33
pdframe = pd.DataFrame(dict_list)
pdframe.sort_values(by=['Ship To'])
pdframe['serial_number'] = pdframe['serial_number'].astype(str).replace('\.0', '', regex=True)
pdframe['Ship To'] = pdframe['Ship To'].astype(np.int64)

############################
pdframe = pdframe.merge(pdframe1, on = 'Ship To', how = 'right')
pdframe.sort_values(by=['Ship To'])
pdframe = pdframe.astype(str)
############3

looprange1 = range(len(pdframe1.index))

looprange = range(int(len(pdframe.index)))

for j in looprange:
    a =[{'serial_number' : pdframe1['serial_number'][k]} for k in looprange1]
    template = 'Template.docx'
    document = MailMerge(template)
    document.merge(
            ship_to1 = pdframe['Ship To'][j],
            mailing_name1 = pdframe['Mailing Name'][j],
            address_line11 = pdframe['Address Line 1'][j],
            address_line21 = pdframe['Address Line 2'][j],
            city1 = pdframe['City'][j],
            state1 = pdframe['State'][j],
            zipcode1 = pdframe['ZipCode'][j],
            ship_to2 = pdframe['Ship To'][j],
            mailing_name2 = pdframe['Mailing Name'][j],
            address_line12 = pdframe['Address Line 1'][j],
            address_line22 = pdframe['Address Line 2'][j],
            city2 = pdframe['City'][j],
            state2 = pdframe['State'][j],
            zipcode2 = pdframe['ZipCode'][j])

    document.merge_rows('serial_number', a)
    document.write(pdframe['Mailing Name'][j]+ ' ' + pdframe['Ship To'][j] +'.docx')

1 Ответ

0 голосов
/ 02 апреля 2020

Чтобы добавить новые строки в таблицу слова do c, я использовал функцию merge_rows () из библиотеки docx-mailmerge.

...