簡體   English   中英

如何使用csv.DictReader讀取特殊字符

[英]How to read in special characters using csv.DictReader

我有以下Flask應用程序的python 3代碼。 對於應用程序(網站),您只需上傳一個TXT或TSV文件(包含作者信息),該文件就會讀入內存(因為它很小,並且該應用程序將被部署到一個只讀文件系統中),然后該應用程序將進行格式化以特定方式顯示結果。

我遇到的問題是,當人們上傳帶有特殊字符的文件時(例如,作者姓名帶有重音符號),我得到了錯誤消息

  File "/Users/cdastmalchi/Desktop/author_script/main.py", line 81, in process_file
    contents = csv.DictReader(file.read().decode('utf-8').splitlines(), delimiter='\t')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 201: invalid start byte

帶有特殊字符的示例行:

Department of Pathology, Lariboisière Hospital, APHP and Paris Diderot University, Sorbonne Paris

燒瓶代碼:

@app.route('/process_file', methods=['POST'])
def process_file():
    # Run checks on the file
    if 'file' not in flask.request.files or not flask.request.files['file'].filename:
        return flask.jsonify({'result':'False', 'message':'no files selected'})
        return flask.redirect(url_for('home'))
    file = flask.request.files['file']
    filename = secure_filename(file.filename)
    if not allowed_file(file.filename):
        return flask.jsonify({'result':'False', 'message':'Must be TXT file!'})
        return flask.redirect(url_for('home'))

    # Stream file and check that places exist
    contents = csv.DictReader(file.read().decode('utf-8').splitlines(), delimiter='\t')
    check_places, json_data = places_exist(contents)

    if check_places is False:
        return flask.jsonify({'result':'False', 'message':'There is an affiliation missing from your Place list. Please re-try.'})
        return flask.redirect(url_for('home'))

    flask.session['filename'] = json_data
    return flask.jsonify({'result':'True'})

更新:

當我執行uchardet {file.tsv} (其中file.tsv是具有特殊字符的測試文件)時,輸出為ISO-8859-9

更新2:

這是我嘗試在具有特殊字符的測試文件上使用csv.Sniffer()嘗試。 但是我不太確定如何轉換此代碼以使用內存中的文件。

import csv

sniff_range = 4096
delimiters = ';\t,'

infile_name = 'unicode.txt'

sniffer = csv.Sniffer()

with open(infile_name, 'r') as infile:
    # Determine dialect
    dialect = sniffer.sniff(
        infile.read(sniff_range), delimiters=delimiters
    )
    infile.seek(0)

    # Sniff for header
    has_header = sniffer.has_header(infile.read(sniff_range))
    infile.seek(0)

    reader = csv.reader(infile, dialect)

    for line in reader:
        print(line)

輸出:

['Department of Pathology', 'Lariboisière Hospital', 'APHP and Paris Diderot University', 'Sorbonne Paris']

問題:如何修改csv.DictReader代碼以處理這些特殊字符(請記住,我只能將文件讀入內存)?

更新3:

我的問題與所謂的“欺騙”有所不同,因為我試圖弄清楚存儲在內存中的文件的編碼,這使事情變得更加棘手。 我試圖在我的process_file Flask路由中實現以下方法以確定編碼,在這種情況下, file是Flask文件存儲對象( file = flask.request.files['file'] )。 但是,當我嘗試打印contents行時,我什么也沒得到。

file = flask.request.files['file']
result = chardet.detect(file.read())
charenc = result['encoding']

contents = csv.DictReader(file.read().decode(charenc).splitlines(), delimiter='\t')

此版本的代碼已成功為我解碼並打印了文件。

  @app.route('/process_file', methods=['POST'])
  def process_file():
      # Run checks on the file
      file = flask.request.files['file']
      result = chardet.detect(file.read())
      charenc = result['encoding']

      file.seek(0)
      # Stream file and check that places exist
      reader = csv.DictReader(file.read().decode(charenc).splitlines())
      for row in reader:
          print(row)

      return flask.jsonify({'result': charenc})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM