我有一個程式可以接受多個輸入檔案的組合,并且還可以使用目錄來掃描這些輸入檔案。
通常,我只接受具有有效檔案擴展名的 CSV、XML 和 JSON 檔案 - 但正如我多年來了解到的那樣,您不能真正相信用戶會提供正確的檔案。
例如,如果用戶有一個帶有 XML 擴展名的檔案,但實際內容是 JSON,我想警告用戶并將該檔案視為 JSON 檔案。另一種情況是在基于 Unix 的作業系統上,檔案擴展名不像 Windows 那樣用于識別檔案型別,與檔案內容相比,這可能會導致更多檔案型別不正確的情況。
現在,我的程式收集檔案串列,將它們過濾為僅具有可接受的檔案擴展名的檔案,然后我創建一個concurrent.futures.ThreadPoolExecutor能夠同時檢查所有檔案的檔案。實際檢查如下所示:
with open(the_file, "r") as f:
check = f.read(1)
if check == "{" or check == "[":
file_type = "json"
elif check == "<":
file_type = "xml"
else:
file_type = "csv"
這有兩個主要問題:
- 如果檔案應該是 CSV,并且它的第一個字符是
[或{或<,那么程式將為其分配錯誤的檔案型別。 - 相反,如果檔案不是任何可接受的型別,并且它不以
[or{或 or開頭<,則程式將假定該檔案應該是 CSV。
我有以下想法來解決這個問題:
import csv
import json
import defusedxml.ElementTree as xml
try:
loaded = xml.parse(the_file)
return "XML"
except xml.ParseError:
del loaded
try:
loaded = json.load(the_file)
return "JSON"
except json.JSONDecodeError:
del loaded
try:
with open(the_file, "r") as csv_file:
loaded = csv.DictReader(csv_file)
return "CSV"
except csv.Error:
print("The file is not in any acceptable format")
問題在于,由于我的程式嘗試同時對多個檔案運行此檢查,因此同時打開這么多檔案時,記憶體使用率可能會變得非常高。另一個小問題是為了檢查檔案型別而同時打開和關閉這么多檔案的 I/O 成本。
對于我正在嘗試做的事情,是否有一些更有效的替代方法?
uj5u.com熱心網友回復:
這里只是一些極端案例示例,以表明您不能既閱讀某些字符又希望分類可靠:
開始像一個 json 但實際上是一個帶有分號分隔符的 csv:
[12];[13,14]
...
開始像一個 xml 但又是一個 csv
<foo>,<bar>,<fee>
1,2,3
...
以空格開頭,但它是一個有效的 xml(空格在_此處注明):
__<foo>text...</foo>
恕我直言,你能做的最好的事情就是讀取檔案的第一個字符來決定首先測驗什么格式,但是:
- 您必須至少閱讀每個檔案一次
- 您將不得不多次閱讀極端情況或不正確的檔案
uj5u.com熱心網友回復:
XML JSON 和 CSV 的呈現方式不同,可以通過第一行來區分。
例如,JSON 可能會以{or開頭[{。
例如 XML 應該從<?xml version="1.0" encoding="UTF-8"?>
CSV開始有點棘手,因為第一行可以有更多種類的輸入,但是根據預期的資料,您可以自定義其他測驗。
這種方法顯然不會驗證實際資料,但可以幫助檢測您正在處理的格式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/382498.html
