![](/img/trans.png)
[英]how to upload and read csv file in django using 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.