使用Python模仿檔案行為
open()
函式)以及模擬輸入輸出流的庫(如
io
模組)來模擬檔案行為。下面是一些示例,展示瞭如何使用這些工具在Python中模擬檔案行為。
1、問題背景
以下是實現程式碼:
import ftplib
import MySQLdb
def MySQLFakeFile( object):
'''
模擬一個只讀檔案,按需轉儲存表資料
透過將其傳遞給FTP協議,可使轉儲更有效率,而無需將其轉儲到某處並在網路上傳輸
'''
def __init__( self, cursor, delimeter, table_name, query):
self. cursor = cursor
self. delimeter = delimeter
self. table_name = table_name
# 查詢類似於select ... FROM %s
self. cursor. execute( query, table_name)
self. _has_written_index = False
# 檔案屬性
self. closed = False
self. name = table_name + ".csv"
self. encoding = "utf-8"
self. mode = "r"
def close( self):
self. cursor. close()
self. closed = True
def flush( self):
'''空操作'''
pass
def read( self, size):
pass
def readline( self, size):
if not self. _has_written_index:
ret = []
for desc in self. cursor. description:
ret. append( desc[ 0])
self. _has_written_index = True
else:
ret = self. cursor. fetchone()
if not ret:
return None
s = ""
for col in ret:
s += str( col) + self. delimeter
return s + "\n"
def readlines( self, size):
ret = []
line = self. readline()
while line:
ret. append( line)
line = self. readline()
def write( self, string):
raise Exception( "無法寫入MySQLFafeFile")
def writelines( self, lines):
raise Exception( "無法寫入MySQLFafeFile")
db = MySQLdb( "host", "user", "pass", "db")
ftp = ftplib. FTP( "host", "user", "pass")
fakeFile = MySQLFakeFile( db. cursor(), ";", "tableName", "SELECT * FROM %s")
ftp. storlines( "STOR tableName.csv", fakeFile)
然而,執行這段程式碼時卻產生了以下錯誤:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/ftplib.py", line 496, in storlines
if len(buf) > self.maxline:
TypeError: object of type 'NoneType' has no len()
2、解決方案
經過分析,發現問題出在readline方法中,當到達行尾時,它返回None而不是空字串("")。同時,readlines方法也沒有返回任何內容。
因此,對readline方法和readlines方法進行了修改,如下:
def readline( self, size):
if not self. _has_written_index:
ret = []
for desc in self. cursor. description:
ret. append( desc[ 0])
self. _has_written_index = True
else:
ret = self. cursor. fetchone()
if not ret:
return None
s = ""
for col in ret:
s += str( col) + self. delimeter
return s + "\n"
def readlines( self, size):
ret = []
while True:
line = self. readline()
if not line:
break
ret. append( line)
return ret
修改後的程式碼執行正常,可以將表資料透過FTP傳輸到指定檔案中。
在這個示例中,我在使用
io.StringIO
建立了一個記憶體中的檔案物件,並向其中寫入了一些文字。然後我們將檔案指標移動到開頭,讀取內容並列印出來。最後,我們關閉記憶體中的檔案物件。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034537/viewspace-3012523/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何使用python把json檔案轉換為csv檔案PythonJSON
- python 將 CVS檔案轉為HTML檔案PythonHTML
- 使用 Python 進行穩定可靠的檔案操作Python
- ubuntu 把檔案設定為可執行檔案Ubuntu
- python 配置檔案如何使用Python
- Python配置檔案使用教程Python
- 將Python程式(.py)轉換為Windows可執行檔案(.exe)PythonWindows
- 使用 Python 處理 CSV 檔案Python
- cmd中如何執行Python檔案Python
- python中修改檔案行內容Python
- python3執行.sql檔案PythonSQL
- python模仿POST提交HTTP資料以及使用Cookie值PythonHTTPCookie
- python把.py檔案改為.exe可執行檔案, 使用cxfreeze包處理及ico圖示設定失敗問題Python
- 教你Python使用shutil操作檔案、subprocess執行子程式的方法Python
- python中pygame遊戲打包為exe檔案PythonGAM遊戲
- python 壓縮檔案並進行郵件傳送(附件格式為zip)Python
- 在Xcode專案中執行Python檔案XCodePython
- 使用 Flutter 模仿美團 AppFlutterAPP
- 21.1 Python 使用PEfile分析PE檔案Python
- 使用Python解析nginx日誌檔案PythonNginx
- 模仿實驗樓專案
- 列印當前python檔案錯誤行Python
- 為什麼python建立檔案打不開Python
- 用Python為PDF檔案批量新增書籤Python
- node使用multer進行檔案上傳
- 使用GnuPG對檔案進行加密(轉)加密
- windows使用bat檔案 執行java程式WindowsBATJava
- 如何在 Mac 上使用預覽將 .pdf 檔案更改為 .jpg 檔案Mac
- 手機使用python操作圖片檔案Python
- Python檔案操作:finally子句的使用Python
- 使用Python批量刪除檔案列表薦Python
- 如何使用Python去除檔案字尾名?Python
- python 使用字典讀取CSV檔案Python
- 使用Artifactory叢集作為檔案共享中心
- Python 打包 windows 可執行的 exe 檔案PythonWindows
- Python按行讀檔案 - XuXn - 部落格園PythonUX
- 如何讓Python指令碼成為在Windows環境中執行的exe檔案Python指令碼Windows
- shell指令碼命令 執行python檔案&python命令列執行python程式碼指令碼Python命令列