Проблема записи файла Python с Pandas - PullRequest
0 голосов
/ 07 декабря 2018

Я написал этот скрипт на python для поиска невидимой почты в почтовом ящике, загрузки вложения xlsx, внесения в него каких-либо изменений, а затем отправки их в другой сервис.Все отлично работает только с одной проблемой: в исходном файле xlsx есть столбец с именем "zona", содержащий двухбуквенную строку итальянского языка для провинции.Если это значение равно «NA» (значение провинции NAPLES), при сохранении результирующих файлов xlsx вместо NA будет пустая ячейка.NA является зарезервированным словом, и если да, есть ли способ его процитировать?

import os,email,imaplib,socket,requests 
import pandas as pd
mail_user = os.environ.get('MAIL_USER')
mail_password = os.environ.get('MAIL_PASS')
mail_server = os.environ.get('MAIL_SERVER')
detach_dir = '.'
url=<removed url>
if mail_user is None or mail_password is None or mail_server is None:
    print ('VARIABILI DI AMBIENTE NON DEFINITE')
    exit(1)
try:
    with imaplib.IMAP4_SSL(mail_server) as m:
        try:
            m.login(mail_user,mail_password)
            m.select("INBOX")
            resp, items = m.search(None, "UNSEEN")
            items = items[0].split()
            for emailid in items:
                resp, data = m.fetch(emailid, "(RFC822)")
                email_body = data[0][1] # getting the mail content
                mail = email.message_from_bytes(email_body) # parsing the mail content to get a mail object
                if mail.get_content_maintype() != 'multipart':
                    continue
                for part in mail.walk():
                    if part.get_content_maintype() == 'multipart':
                        continue
                    if part.get('Content-Disposition') is None:
                        continue
                    filename = part.get_filename()
                    if filename.endswith('.xlsx'):
                        att_path = os.path.join(detach_dir, filename)
                        fp = open(att_path, 'wb')
                        fp.write(part.get_payload(decode=True))
                        fp.close()
                        xl = pd.ExcelFile(att_path)
                        df1 = xl.parse(sheet_name=0)
                        df1 = df1.replace({'\'':''}, regex=True)
                        df1.loc[df1['Prodotto'] == 'SP_TABLETA_SAMSUNG','Cod. ID.'] = 'X'
                        df1.loc[df1['Prodotto'] == 'AP_TLC','Cod. ID.'] = 'X'
                        df1.loc[df1['Prodotto'] == 'APDCMB00003','Cod. ID.'] = 'X'
                        df1.loc[df1['Prodotto'] == 'APDCMB03252','Cod. ID.'] = 'X'
                        writer = pd.ExcelWriter(att_path, engine='xlsxwriter')
                        df1.to_excel(writer, sheet_name='Foglio1', index=False)
                        writer.save()
                        uf = {'files': open(att_path, 'rb')}
                        http.client.HTTPConnection.debuglevel = 0
                        r = requests.post(url, files=uf)
                        print (r.text)
        except imaplib.IMAP4_SSL.error as e:
            print (e)
            exit(1)
except imaplib.IMAP4.error:
    print ("Errore di connessione al server")
    exit(1)

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Чтение поста с ссылками на документы @Matt B. Я нашел это решение:

df1 = xl.parse(sheet_name=0, keep_default_na=False, na_values=['_'])

Если я хорошо понимаю, только _ интерпретируются как "недоступные"

0 голосов
/ 07 декабря 2018

Похоже, что Pandas рассматривает значение NA как NaN, и поэтому, когда вы пишете в excel, по умолчанию это значение записывается как '' (см. docs ).

Вы можете передать na_rep='NA' в функцию to_excel(), чтобы записать ее в виде строки;

df1.to_excel(writer, sheet_name='Foglio1', index=False, na_rep='NA')

Но в качестве меры предосторожности следите за любыми другими значениями NaN, присутствующими в вашем dfтакже будет записан в файл Excel как 'NA'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...