Python中文件名編碼問題的解決方案深度解析
引言
在跨平臺文件處理和國際化軟件開發(fā)中,文件名編碼問題是一個常見且棘手的挑戰(zhàn)。不同操作系統(tǒng)采用不同的默認(rèn)文件編碼方式:Windows通常使用UTF-16編碼但通過ANSI代碼頁與應(yīng)用程序交互,Linux和macOS則普遍采用UTF-8編碼。這種差異導(dǎo)致在處理包含非ASCII字符(如中文、日文、特殊符號等)的文件名時,經(jīng)常出現(xiàn)亂碼、文件無法找到或操作失敗等問題。
Python作為一門跨平臺編程語言,提供了多種處理文件名編碼的技術(shù)和策略。從直接操作原始字節(jié)到智能編碼檢測,從錯誤恢復(fù)機制到統(tǒng)一編碼轉(zhuǎn)換,掌握這些技術(shù)對于開發(fā)健壯的跨平臺文件處理應(yīng)用至關(guān)重要。特別是在處理用戶上傳的文件、遍歷國際化的目錄結(jié)構(gòu)或構(gòu)建文件管理工具時,正確處理文件名編碼問題顯得尤為重要。
本文將深入探討Python中繞過文件名編碼問題的各種方法,分析其原理、適用場景和注意事項。我們將從基礎(chǔ)的文件名表示方式講起,逐步深入到高級的編碼檢測和轉(zhuǎn)換技術(shù),并通過大量實際示例展示如何在不同場景下選擇和應(yīng)用最合適的解決方案。
一、理解文件名編碼問題的根源
1.1 不同操作系統(tǒng)的文件名編碼差異
import sys
import platform
def analyze_system_encoding():
"""分析當(dāng)前系統(tǒng)的文件名編碼情況"""
print(f"操作系統(tǒng): {platform.system()} {platform.release()}")
print(f"Python版本: {sys.version}")
print(f"默認(rèn)文件系統(tǒng)編碼: {sys.getfilesystemencoding()}")
print(f"默認(rèn)字符串編碼: {sys.getdefaultencoding()}")
# 檢查平臺特定信息
if platform.system() == "Windows":
import locale
print(f"Windows ANSI代碼頁: {locale.getpreferredencoding()}")
elif platform.system() == "Linux":
# 在Linux上檢查LANG環(huán)境變量
lang = os.environ.get('LANG', '未設(shè)置')
print(f"LANG環(huán)境變量: {lang}")
# 運行分析
analyze_system_encoding()1.2 編碼問題的表現(xiàn)形式
文件名編碼問題通常表現(xiàn)為以下幾種形式:
- ??亂碼顯示??:文件名顯示為無意義的字符序列
- ??文件找不到??:即使文件確實存在,也無法通過路徑訪問
- ??操作失敗??:文件操作(復(fù)制、重命名、刪除等)因編碼問題失敗
- ??兼容性問題??:在不同系統(tǒng)間傳輸文件時出現(xiàn)名稱錯誤
二、基礎(chǔ)解決方案:使用原始字節(jié)接口
2.1 使用字節(jié)路徑處理文件操作
Python的許多文件操作函數(shù)支持字節(jié)路徑,這可以繞過字符串編碼問題。
import os
import sys
def file_operations_with_bytes(path_bytes):
"""
使用字節(jié)路徑進(jìn)行文件操作
"""
try:
# 檢查文件是否存在
if os.path.exists(path_bytes):
print("文件存在")
# 獲取文件狀態(tài)
stat_info = os.stat(path_bytes)
print(f"文件大小: {stat_info.st_size} 字節(jié)")
# 讀取文件內(nèi)容
with open(path_bytes, 'rb') as f:
content = f.read(100) # 讀取前100字節(jié)
print(f"文件開頭: {content[:20]}...")
return True
else:
print("文件不存在")
return False
except Exception as e:
print(f"文件操作失敗: {e}")
return False
# 示例:處理可能包含特殊字符的文件名
def handle_problematic_filename():
# 假設(shè)我們有一個可能編碼有問題的文件名
original_path = "中文文件.txt" # 可能在某些環(huán)境下編碼錯誤
try:
# 嘗試轉(zhuǎn)換為字節(jié)
if isinstance(original_path, str):
# 使用文件系統(tǒng)編碼轉(zhuǎn)換為字節(jié)
byte_path = original_path.encode(sys.getfilesystemencoding())
else:
byte_path = original_path
# 使用字節(jié)路徑進(jìn)行操作
success = file_operations_with_bytes(byte_path)
return success
except UnicodeEncodeError as e:
print(f"編碼失敗: {e}")
return False
# 使用示例
handle_problematic_filename()2.2 目錄遍歷中的字節(jié)路徑使用
import os
import sys
def list_directory_bytes(directory_path):
"""
使用字節(jié)路徑列出目錄內(nèi)容
"""
try:
# 確保路徑是字節(jié)格式
if isinstance(directory_path, str):
directory_bytes = directory_path.encode(sys.getfilesystemencoding())
else:
directory_bytes = directory_path
# 使用os.listdir的字節(jié)版本
with os.scandir(directory_bytes) as entries:
for entry in entries:
# entry.name 在Python 3.5+中是字符串,但我們可以獲取原始字節(jié)信息
print(f"條目: {entry.name}")
# 對于需要原始字節(jié)的場景,可以這樣處理
try:
# 嘗試以字符串方式處理
if entry.is_file():
print(f" 類型: 文件")
elif entry.is_dir():
print(f" 類型: 目錄")
except UnicodeError:
# 如果字符串處理失敗,使用字節(jié)方式
print(f" 類型: 未知(編碼問題)")
# 這里可以使用entry.path獲取字節(jié)路徑進(jìn)行進(jìn)一步操作
except FileNotFoundError:
print("目錄不存在")
except PermissionError:
print("沒有訪問權(quán)限")
except Exception as e:
print(f"列出目錄時出錯: {e}")
# 使用示例
list_directory_bytes("/path/to/directory")三、高級編碼處理策略
3.1 編碼檢測與轉(zhuǎn)換
import chardet
from pathlib import Path
class SmartFilenameDecoder:
"""
智能文件名解碼器
"""
def __init__(self):
self.common_encodings = ['utf-8', 'gbk', 'gb2312', 'shift_jis',
'iso-8859-1', 'windows-1252']
def detect_filename_encoding(self, byte_sequence):
"""
檢測字節(jié)序列的編碼
"""
# 首先嘗試常見編碼
for encoding in self.common_encodings:
try:
decoded = byte_sequence.decode(encoding)
# 簡單的有效性檢查:是否包含可打印字符
if any(c.isprintable() or c.isspace() for c in decoded):
return encoding, decoded
except UnicodeDecodeError:
continue
# 使用chardet進(jìn)行智能檢測
try:
result = chardet.detect(byte_sequence)
if result['confidence'] > 0.7: # 置信度閾值
encoding = result['encoding']
decoded = byte_sequence.decode(encoding)
return encoding, decoded
except:
pass
# 最后嘗試:使用替換錯誤處理
try:
decoded = byte_sequence.decode('utf-8', errors='replace')
return 'utf-8-with-replace', decoded
except:
return None, None
def safe_path_conversion(self, raw_path):
"""
安全路徑轉(zhuǎn)換
"""
if isinstance(raw_path, bytes):
encoding, decoded = self.detect_filename_encoding(raw_path)
if decoded:
return decoded
else:
# 無法解碼,返回可讀的字節(jié)表示
return f"byte_{raw_path.hex()[:16]}..."
else:
return raw_path
# 使用示例
decoder = SmartFilenameDecoder()
# 測試各種編碼
test_bytes = [
"中文文件.txt".encode('gbk'),
"日本語ファイル.txt".encode('shift_jis'),
"file with spécial chars.txt".encode('utf-8'),
b'\xff\xfe\x00\x00' # 無效字節(jié)序列
]
for i, byte_data in enumerate(test_bytes):
encoding, decoded = decoder.detect_filename_encoding(byte_data)
print(f"測試 {i+1}: 編碼={encoding}, 解碼結(jié)果={decoded}")3.2 處理混合編碼目錄
import os
from pathlib import Path
class MixedEncodingHandler:
"""
處理混合編碼目錄的工具類
"""
def __init__(self):
self.decoder = SmartFilenameDecoder()
def walk_mixed_encoding(self, root_dir):
"""
遍歷可能包含混合編碼的目錄
"""
root_path = Path(root_dir)
try:
with os.scandir(root_dir) as entries:
for entry in entries:
try:
# 嘗試正常處理
entry_name = entry.name
entry_path = entry.path
if entry.is_file():
print(f"文件: {entry_name}")
elif entry.is_dir():
print(f"目錄: {entry_name}/")
# 遞歸遍歷子目錄
self.walk_mixed_encoding(entry_path)
except UnicodeError:
# 遇到編碼問題,使用字節(jié)方式處理
print("遇到編碼問題,使用字節(jié)方式處理...")
self._handle_encoding_problem(entry)
except Exception as e:
print(f"遍歷目錄時出錯: {e}")
def _handle_encoding_problem(self, entry):
"""
處理編碼有問題的目錄條目
"""
try:
# 獲取原始字節(jié)信息(通過路徑)
byte_path = getattr(entry, '_name_bytes', None)
if byte_path is None:
# 對于某些系統(tǒng),可能需要其他方式獲取字節(jié)名稱
byte_path = entry.path.encode('latin-1', errors='replace')
# 嘗試解碼
decoded_name = self.decoder.safe_path_conversion(byte_path)
# 獲取文件類型
try:
if entry.is_file():
file_type = "文件"
elif entry.is_dir():
file_type = "目錄"
else:
file_type = "其他"
except:
file_type = "未知"
print(f"{file_type} (編碼問題): {decoded_name}")
except Exception as e:
print(f"處理編碼問題時出錯: {e}")
# 使用示例
handler = MixedEncodingHandler()
handler.walk_mixed_encoding("/path/to/problematic/directory")四、實戰(zhàn)應(yīng)用案例
4.1 文件同步工具中的編碼處理
import os
import shutil
from pathlib import Path
class EncodingAwareFileSync:
"""
支持編碼處理的文件同步工具
"""
def __init__(self, source_dir, target_dir):
self.source_dir = Path(source_dir)
self.target_dir = Path(target_dir)
self.decoder = SmartFilenameDecoder()
def sync_files(self):
"""
同步文件,處理編碼問題
"""
if not self.source_dir.exists():
print("源目錄不存在")
return False
# 確保目標(biāo)目錄存在
self.target_dir.mkdir(parents=True, exist_ok=True)
# 遍歷源目錄
for root, dirs, files in os.walk(self.source_dir):
# 處理相對路徑
rel_path = Path(root).relative_to(self.source_dir)
# 創(chuàng)建對應(yīng)的目標(biāo)目錄
target_root = self.target_dir / rel_path
target_root.mkdir(exist_ok=True)
# 處理文件
for file in files:
source_file = Path(root) / file
target_file = target_root / file
self._sync_single_file(source_file, target_file)
return True
def _sync_single_file(self, source_file, target_file):
"""
同步單個文件
"""
try:
# 正常情況下的同步
if not target_file.exists() or \
source_file.stat().st_mtime > target_file.stat().st_mtime:
shutil.copy2(source_file, target_file)
print(f"同步: {source_file} -> {target_file}")
except UnicodeError:
# 處理編碼問題
self._handle_encoding_sync(source_file, target_file)
except Exception as e:
print(f"同步文件時出錯: {source_file} - {e}")
def _handle_encoding_sync(self, source_file, target_file):
"""
處理編碼有問題的文件同步
"""
try:
# 獲取字節(jié)路徑
source_bytes = str(source_file).encode('latin-1', errors='replace')
target_bytes = str(target_file).encode('latin-1', errors='replace')
# 使用字節(jié)路徑操作
with open(source_bytes, 'rb') as src:
content = src.read()
with open(target_bytes, 'wb') as dst:
dst.write(content)
# 復(fù)制元數(shù)據(jù)
stat = os.stat(source_bytes)
os.utime(target_bytes, (stat.st_atime, stat.st_mtime))
decoded_name = self.decoder.safe_path_conversion(source_bytes)
print(f"同步(編碼處理): {decoded_name}")
except Exception as e:
print(f"處理編碼同步時出錯: {e}")
# 使用示例
sync_tool = EncodingAwareFileSync("/source/directory", "/target/directory")
sync_tool.sync_files()4.2 文件名編碼修復(fù)工具
import os
import re
from pathlib import Path
class FilenameEncodingFixer:
"""
文件名編碼修復(fù)工具
"""
def __init__(self):
self.decoder = SmartFilenameDecoder()
self.encoding_stats = {}
def fix_directory_encodings(self, directory_path, dry_run=True):
"""
修復(fù)目錄中的文件名編碼問題
"""
dir_path = Path(directory_path)
if not dir_path.exists() or not dir_path.is_dir():
print("目錄不存在或不是目錄")
return False
fixed_count = 0
problem_count = 0
# 遍歷目錄
for item in dir_path.iterdir():
original_name = item.name
original_path = item
try:
# 測試文件名是否可正常處理
test = str(original_name)
# 如果正常,跳過
if self._is_valid_filename(original_name):
continue
except UnicodeError:
# 發(fā)現(xiàn)編碼問題
problem_count += 1
if not dry_run:
# 嘗試修復(fù)
success = self._fix_single_filename(original_path)
if success:
fixed_count += 1
else:
print(f"發(fā)現(xiàn)編碼問題: {original_name}")
print(f"發(fā)現(xiàn) {problem_count} 個編碼問題,修復(fù) {fixed_count} 個")
return True
def _is_valid_filename(self, filename):
"""
檢查文件名是否有效
"""
try:
# 嘗試編碼和解碼
encoded = filename.encode('utf-8')
decoded = encoded.decode('utf-8')
# 檢查是否包含非法字符(根據(jù)操作系統(tǒng))
if os.name == 'nt': # Windows
invalid_chars = r'[<>:"/\\|?*]'
else: # Unix/Linux
invalid_chars = r'[/]'
if re.search(invalid_chars, filename):
return False
return True
except UnicodeError:
return False
def _fix_single_filename(self, file_path):
"""
修復(fù)單個文件名
"""
try:
# 獲取原始字節(jié)名稱
original_bytes = str(file_path).encode('latin-1', errors='replace')
# 嘗試檢測正確編碼
encoding, decoded_name = self.decoder.detect_filename_encoding(original_bytes)
if not decoded_name:
print(f"無法修復(fù): {file_path}")
return False
# 生成新路徑
parent_dir = file_path.parent
new_path = parent_dir / decoded_name
# 避免名稱沖突
counter = 1
while new_path.exists():
stem = file_path.stem
suffix = file_path.suffix
new_name = f"{stem}_{counter}{suffix}"
new_path = parent_dir / new_name
counter += 1
# 重命名文件
file_path.rename(new_path)
print(f"修復(fù): {file_path.name} -> {new_path.name}")
return True
except Exception as e:
print(f"修復(fù)文件名時出錯: {file_path} - {e}")
return False
# 使用示例
fixer = FilenameEncodingFixer()
# 先進(jìn)行干運行(不實際修改)
fixer.fix_directory_encodings("/path/to/fix", dry_run=True)
# 實際修復(fù)
fixer.fix_directory_encodings("/path/to/fix", dry_run=False)五、跨平臺兼容性處理
統(tǒng)一文件名處理框架
import os
import sys
from pathlib import Path
class CrossPlatformFilenameHandler:
"""
跨平臺文件名處理框架
"""
def __init__(self):
self.system_encoding = sys.getfilesystemencoding()
self.is_windows = os.name == 'nt'
def normalize_filename(self, filename):
"""
規(guī)范化文件名,確保跨平臺兼容
"""
if isinstance(filename, bytes):
# 字節(jié)文件名,需要解碼
try:
decoded = filename.decode(self.system_encoding)
return self._sanitize_filename(decoded)
except UnicodeDecodeError:
# 解碼失敗,使用安全轉(zhuǎn)換
return self._safe_byte_conversion(filename)
else:
# 字符串文件名,進(jìn)行清理
return self._sanitize_filename(filename)
def _sanitize_filename(self, filename):
"""
清理文件名,移除非法字符
"""
# 定義非法字符(根據(jù)操作系統(tǒng))
if self.is_windows:
invalid_chars = r'[<>:"/\\|?*]'
max_length = 255 # Windows文件名長度限制
else:
invalid_chars = r'[/]'
max_length = 255 # 一般Unix限制
# 移除非法字符
import re
sanitized = re.sub(invalid_chars, '_', filename)
# 處理保留名稱(Windows)
if self.is_windows:
reserved_names = {'CON', 'PRN', 'AUX', 'NUL',
'COM1', 'COM2', 'COM3', 'COM4', 'COM5',
'COM6', 'COM7', 'COM8', 'COM9',
'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5',
'LPT6', 'LPT7', 'LPT8', 'LPT9'}
if sanitized.upper() in reserved_names:
sanitized = f"_{sanitized}"
# 截斷過長文件名
if len(sanitized) > max_length:
stem = Path(sanitized).stem
suffix = Path(sanitized).suffix
# 保留后綴,截斷主干
if len(suffix) < max_length:
stem_max = max_length - len(suffix)
sanitized = stem[:stem_max] + suffix
else:
sanitized = sanitized[:max_length]
return sanitized
def _safe_byte_conversion(self, byte_filename):
"""
安全轉(zhuǎn)換字節(jié)文件名
"""
try:
# 嘗試常見編碼
for encoding in ['utf-8', 'gbk', 'iso-8859-1']:
try:
decoded = byte_filename.decode(encoding)
return self._sanitize_filename(decoded)
except UnicodeDecodeError:
continue
# 所有編碼都失敗,使用十六進(jìn)制表示
hex_str = byte_filename.hex()[:16]
return f"unknown_{hex_str}"
except Exception:
return "invalid_filename"
def create_cross_platform_path(self, *path_parts):
"""
創(chuàng)建跨平臺兼容的路徑
"""
normalized_parts = []
for part in path_parts:
if isinstance(part, Path):
part = str(part)
normalized = self.normalize_filename(part)
normalized_parts.append(normalized)
# 使用pathlib構(gòu)建路徑
path = Path(normalized_parts[0])
for part in normalized_parts[1:]:
path = path / part
return path
# 使用示例
filename_handler = CrossPlatformFilenameHandler()
# 測試各種文件名
test_names = [
"正常文件.txt",
"file with spaces.doc",
"包含/非法/字符.txt", # Unix非法
"包含:非法字符.txt", # Windows非法
b'\xff\xfeinvalid bytes'.hex() # 無效字節(jié)
]
for name in test_names:
normalized = filename_handler.normalize_filename(name)
print(f"原始: {name} -> 規(guī)范化: {normalized}")六、最佳實踐與總結(jié)
6.1 文件名編碼處理最佳實踐
- ??始終明確編碼??:在文件操作中明確指定編碼方式,避免依賴系統(tǒng)默認(rèn)設(shè)置
- ??使用字節(jié)接口??:對于可能包含編碼問題的文件,使用字節(jié)路徑進(jìn)行操作
- ??實施防御性編程??:假設(shè)所有文件名都可能包含編碼問題,添加適當(dāng)?shù)腻e誤處理
- ??統(tǒng)一編碼策略??:在項目中統(tǒng)一使用UTF-8編碼處理文件名
- ??記錄編碼信息??:在處理文件時記錄使用的編碼方式,便于后續(xù)調(diào)試
6.2 性能與可靠性平衡
import time
from functools import wraps
def timing_decorator(func):
"""執(zhí)行時間測量裝飾器"""
@wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"{func.__name__} 執(zhí)行時間: {end_time - start_time:.4f}秒")
return result
return wrapper
class OptimizedEncodingHandler(CrossPlatformFilenameHandler):
"""
優(yōu)化的編碼處理器,平衡性能與可靠性
"""
def __init__(self):
super().__init__()
self.encoding_cache = {} # 編碼檢測緩存
@timing_decorator
def batch_process_files(self, file_list):
"""
批量處理文件列表
"""
results = []
for file_path in file_list:
try:
# 使用緩存優(yōu)化重復(fù)文件的處理
if file_path in self.encoding_cache:
result = self.encoding_cache[file_path]
else:
result = self.normalize_filename(file_path)
self.encoding_cache[file_path] = result
results.append(result)
except Exception as e:
results.append(f"error:{e}")
return results
# 使用示例
optimized_handler = OptimizedEncodingHandler()
# 生成測試文件列表
test_files = ["測試文件.txt"] * 1000 + ["another_file.pdf"] * 500
# 批量處理
results = optimized_handler.batch_process_files(test_files)
print(f"處理 {len(results)} 個文件")總結(jié)
文件名編碼問題是Python跨平臺文件處理中的一個復(fù)雜但重要的話題。通過本文的探討,我們了解了問題的根源、各種解決方案以及實際應(yīng)用技巧。
??關(guān)鍵要點總結(jié):??
1.??問題根源??:不同操作系統(tǒng)使用不同的文件編碼方式是問題的根本原因
2.??解決方案??:
- 使用字節(jié)接口繞過字符串編碼問題
- 實施智能編碼檢測和轉(zhuǎn)換
- 采用統(tǒng)一的文件名規(guī)范化策略
3.??性能考量??:通過緩存和批量處理優(yōu)化編碼檢測性能
4.??錯誤處理??:健全的錯誤處理機制是生產(chǎn)環(huán)境應(yīng)用的必備條件
5.??跨平臺兼容??:考慮不同操作系統(tǒng)的文件名限制和特殊規(guī)則
??最佳實踐建議:??
- 在生產(chǎn)代碼中始終處理可能的編碼異常
- 對于國際化的應(yīng)用,統(tǒng)一使用UTF-8編碼
- 實施文件名規(guī)范化,確保跨平臺兼容性
- 使用pathlib等現(xiàn)代庫進(jìn)行文件路徑操作
- 在性能敏感的場景中使用緩存和批量處理
通過掌握這些技術(shù)和最佳實踐,開發(fā)者可以構(gòu)建出健壯、可靠且跨平臺兼容的文件處理應(yīng)用程序,能夠妥善處理各種文件名編碼問題,為用戶提供更好的體驗。
以上就是Python中文件名編碼問題的解決方案深度解析的詳細(xì)內(nèi)容,更多關(guān)于Python文件名編碼問題的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python?Django實現(xiàn)增刪改查實戰(zhàn)代碼
這篇文章主要介紹了python?Django增刪改查快速體驗,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02
Python數(shù)據(jù)分析Numpy中常用相關(guān)性函數(shù)
這篇文章主要為大家介紹了Python數(shù)據(jù)分析Numpy中常用相關(guān)性函數(shù)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Python 數(shù)據(jù)化運營之KMeans聚類分析總結(jié)
這篇文章主要介紹了Python 數(shù)據(jù)化運營KMeans聚類相關(guān)的一些總結(jié),感興趣的話一起來閱讀下文吧2021-08-08
PyTorch?Tensor創(chuàng)建實現(xiàn)
本文主要介紹了PyTorch?Tensor創(chuàng)建實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Python學(xué)習(xí)小技巧之列表項的推導(dǎo)式與過濾操作
這篇文章主要給大家介紹了Python學(xué)習(xí)小技巧之列表項的推導(dǎo)式與過濾操作的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看把。2017-05-05
Django url,從一個頁面調(diào)到另個頁面的方法
今天小編就為大家分享一篇Django url,從一個頁面調(diào)到另個頁面的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
Pycharm使用Database?Navigator連接mysql數(shù)據(jù)庫全過程
這篇文章主要介紹了Pycharm使用Database?Navigator連接mysql數(shù)據(jù)庫全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
Python訪問MongoDB,并且轉(zhuǎn)換成Dataframe的方法
今天小編就為大家分享一篇Python訪問MongoDB,并且轉(zhuǎn)換成Dataframe的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10

