python 更多文件操作

2021-09-15 14:47 更新

練習(xí)17.更多文件操作

現(xiàn)在讓我們再學(xué)習(xí)幾種文件操作。我們將編寫一個Python腳本,將一個文件中的內(nèi)容拷貝到另外一個文件中。這個腳本很短,不過它會讓你對于文件操作有更多的了解。

from sys import argv
from os.path import exists

script, from_file, to_file = argv

print "Copying from %s to %s" % (from_file, to_file)

# we could do these two on one line, how?
in_file = open(from_file)
indata = in_file.read()

print "The input file is %d bytes long" % len(indata)

print "Does the output file exist? %r" % exists(to_file)
print "Ready, hit RETURN to continue, CTRL-C to abort."
raw_input()

out_file = open(to_file, 'w')
out_file.write(indata)

print "Alright, all done."

out_file.close()
in_file.close()

你應(yīng)該很快注意到了我們import了又一個很好用的命令exists。這個命令將文件名字符串作為參數(shù),如果文件存在的話,它將返回True,否則將返回 False。在本書的下半部分,我們將使用這個函數(shù)做很多的事情,不過現(xiàn)在你應(yīng)該學(xué)會怎樣通過 import 調(diào)用它.

通過使用import,你可以在自己代碼中直接使用其他更厲害的(通常是這樣,不過也不 盡然)程序員寫的大量免費(fèi)代碼,這樣你就不需要重寫一遍了。

你看到的結(jié)果

和你前面寫的腳本一樣,運(yùn)行該腳本需要兩個參數(shù),一個是待拷貝的文件,一個是要拷貝至的文件。我再創(chuàng)建一個名為test.txt的測試文件,我們將看到如下的結(jié)果:

$ echo "This is a test file." > test.txt

$ cat test.txt This is a test file. $ $ python ex17.py test.txt new_file.txt Copying from test.txt to new_file.txt The input file is 21 bytes long Does the output file exist? False Ready, hit RETURN to continue, CTRL-C to abort.

Alright, all done.

該命令對于任何文件都應(yīng)該是有效的。試試操作一些別的文件看看結(jié)果。不過小心別把你的重要文件給弄壞了。

Warning:你看到我用echo命令創(chuàng)建一個文件,并用cat命令展示一個文件了吧?它們只能在 Linux 和 OSX 下使用,你可以閱讀附錄A獲得者兩個命令的使用方法。

附加題

  1. 這個腳本 實在是有點(diǎn)煩人。沒必要在拷貝之前問一遍把,沒必要在屏幕上輸出那么多東西。試著刪掉腳本的一些功能,讓它使用起來更加友好。
  2. 看看你能把這個腳本改多短,我可以把它寫成一行。
  3. 我使用了一個叫cat的東西,這個古老的命令的用處是將兩個文件“連接(concatenate)”到一起,不過實際上它最大的用途是打印文件內(nèi)容到屏幕上。你可以通過 man cat 命令了解到更多信息。(windows下沒有這個命令)
  4. 找出為什么你需要在代碼中寫 output.close() 。
  5. 再多讀讀和import相關(guān)的材料,將python運(yùn)行起來,試試這一條命令。試著看看自己能不能摸出點(diǎn)門道,當(dāng)然了,即使弄不明白也沒關(guān)系。

常見問題

Q: 為什么'w'要寫在引號里?

它只是個字符串,你已經(jīng)做過太多關(guān)于字符串的練習(xí)了,你知道什么是字符串的,對嗎?

Q:總是感覺這些練習(xí)很難,這正常嗎?

這很正常的。直到你做完練習(xí)36甚至完成這本書的學(xué)習(xí),用python做出一些作品,編程對你來說可能都不是一件簡單的事情。每個人都不一樣,所以只要堅持復(fù)習(xí)你認(rèn)為困難的習(xí)題,直到你真的搞明白它們,要有耐心。

Q:函數(shù)len()是干什么用的?

它能獲得參數(shù)的長度,返回值是一個數(shù)字,你試著用用這個方法。

Q:我嘗試改短代碼的時候,在腳本的結(jié)尾處遇到一個關(guān)于文件關(guān)閉的問題。

你可能做了一些類似這樣的事情,比如indata = open(from_file).read(),這樣寫的話,就不需要在執(zhí)行關(guān)閉操作,當(dāng)執(zhí)行完這一行的時候,文件自動就被關(guān)閉了。

Q: 我遇到一個異常Syntax:EOL while scanning string literal

你應(yīng)該是忘記在字符串的結(jié)尾加上引號了,回到你出錯的那行代碼,檢查一下。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號