Не удается загрузить CSV-файл в формате Google Sheet со специальными символами в содержимом - PullRequest
0 голосов
/ 25 мая 2018

Я ломал голову, пытаясь понять, почему я не могу загрузить файл на Google Drive через службу API.Я указал, что проблема связана со специальным персонажем в покемонах.Если я изменю это на обычный e, то при загрузке файла проблем не возникнет.

Я уже обнаружил, попробовал следующий метод, который работает, но я теряю é в целом.

.encode('ascii','ignore').decode('ascii')

IsЕсть ли способ изменить кодировку, которую API использует для загрузки файла?Ошибка, которую я постоянно получаю:

UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 3: ordinal not in range(128)

Мой пример кода указан ниже

from httplib2 import Http
import io
from apiclient.discovery import build
from apiclient import errors
from apiclient.http import MediaFileUpload, MediaIoBaseDownload, MediaIoBaseUpload

# If modifying these scopes, delete your previously saved credentials
# at ~/.credentials/drive-python-quickstart.json
SCOPES = 'https://www.googleapis.com/auth/drive'
CLIENT_SECRET_FILE = 'client_secret.json'
APPLICATION_NAME = 'Drive API Python Quickstart'

#performs authorization
authInst = auth(SCOPES,CLIENT_SECRET_FILE,APPLICATION_NAME)

#gets the credentials for use
credentials = authInst.getCredentials()

#sets up the drive service from which functions can be created
drive_service = build('drive', 'v3', http=credentials.authorize(Http()))

test = 'Pokémon, test, hello\nmark,john,kevin'.encode('ascii','ignore').decode('ascii')
fh = io.StringIO(test)
media = MediaIoBaseUpload(fh,
                          mimetype='text/csv',
                          resumable = False)
filename = 'csvtest'
file_metadata = {'name': filename, 'mimeType': 'application/vnd.google-apps.spreadsheet'}    
file = drive_service.files().create(body=file_metadata,\
                                          media_body=media,\
                                          fields='id').execute()
fileID = file.get('id')
print(fileID)

Наконец, я сделал это вручную, используя настоящий Google Drive с файлом, который просто содержит Pokémon и я.Я никогда не терял его, поэтому я чувствую, что это возможно.

1 Ответ

0 голосов
/ 26 мая 2018

При .encode('ascii','ignore'), é игнорируется.Так как насчет загрузки данных с помощью BytesIO?Не могли бы вы попробовать изменить следующим образом?

С:

test = 'Pokémon, test, hello\nmark,john,kevin'.encode('ascii','ignore').decode('ascii')
fh = io.StringIO(test)

Кому:

test = 'Pokémon, test, hello\nmark, john, kevin'.encode('utf-8')
fh = io.BytesIO(test)

Ссылка:

В моей среде это работает.Но если это не было решением вашей ситуации, извините.

...