天天看點

Python中如何讀寫檔案

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

<code>Python讀寫檔案</code>

<code>1</code><code>.open</code>

<code>使用open打開檔案後一定要記得調用檔案對象的close()方法。</code>

<code>比如可以用</code><code>try</code><code>/</code><code>finally</code><code>語句來確定最後能關閉檔案。</code>

<code>file_object = open(</code><code>'thefile.txt'</code><code>)</code>

<code>try</code><code>:</code>

<code>     </code><code>all_the_text = file_object.read( )</code>

<code>finally</code><code>:</code>

<code>     </code><code>file_object.close( )</code>

<code>注:不能把open語句放在</code><code>try</code><code>塊裡,因為當打開檔案出現異常時,</code>

<code>檔案對象file_object無法執行close()方法。</code>

<code>2</code><code>.讀檔案</code>

<code>讀文本檔案</code>

<code>input = open(</code><code>'data'</code><code>, </code><code>'r'</code><code>)</code>

<code>#第二個參數預設為r</code>

<code>input = open(</code><code>'data'</code><code>)</code>

<code> </code> 

<code>讀二進制檔案</code>

<code>input = open(</code><code>'data'</code><code>, </code><code>'rb'</code><code>)</code>

<code>讀取所有内容</code>

<code>讀固定位元組</code>

<code>file_object = open(</code><code>'abinfile'</code><code>, </code><code>'rb'</code><code>)</code>

<code>    </code><code>while</code> <code>True:</code>

<code>         </code><code>chunk = file_object.read(</code><code>100</code><code>)</code>

<code>        </code><code>if</code> <code>not chunk:</code>

<code>            </code><code>break</code>

<code>         </code><code>do_something_with(chunk)</code>

<code>讀每行</code>

<code>list_of_all_the_lines = file_object.readlines( )</code>

<code>如果檔案是文本檔案,還可以直接周遊檔案對象擷取每行:</code>

<code>for</code> <code>line </code><code>in</code> <code>file_object:</code>

<code>     </code><code>process line</code>

<code>3</code><code>.寫檔案</code>

<code>寫文本檔案</code>

<code>output = open(</code><code>'data'</code><code>, </code><code>'w'</code><code>)</code>

<code>寫二進制檔案</code>

<code>output = open(</code><code>'data'</code><code>, </code><code>'wb'</code><code>)</code>

<code>追加寫檔案</code>

<code>output = open(</code><code>'data'</code><code>, </code><code>'w+'</code><code>)</code>

<code>寫資料</code>

<code>file_object = open(</code><code>'thefile.txt'</code><code>, </code><code>'w'</code><code>)</code>

<code>file_object.write(all_the_text)</code>

<code>file_object.close( )</code>

<code>寫入多行</code>

<code>file_object.writelines(list_of_text_strings)</code>

<code>注意,調用writelines寫入多行在性能上會比使用write一次性寫入要高。</code>

<code>在處理日志檔案的時候,常常會遇到這樣的情況:日志檔案巨大,不可能一次性把整個檔案讀入到記憶體</code>

<code>中進行處理,例如需要在一台實體記憶體為 2GB 的機器上處理一個 2GB 的日志檔案,我們可能希望每次</code>

<code>隻處理其中 200MB 的内容。</code>

<code>在 Python 中,内置的 File 對象直接提供了一個 readlines(sizehint) 函數來完成這樣的事情。</code>

<code>以下面的代碼為例:</code>

<code>file = open(</code><code>'test.log'</code><code>, </code><code>'r'</code><code>)sizehint = </code><code>209715200</code>   <code># 200Mposition = </code>

<code>0lines = file.readlines(sizehint)</code><code>while</code> <code>not file.tell() - position &lt; </code>

<code>0</code><code>:       position = file.tell()       lines = file.readlines(sizehint)</code>

<code>每次調用 readlines(sizehint) 函數,會傳回大約 200MB </code>

<code>的資料,而且所傳回的必然都是完整的行資料,大多數情況下,傳回的資料的位元組數會稍微比 </code>

<code>sizehint 指定的值大一點(除最後一次調用 readlines(sizehint) 函數的時候)。</code>

<code>通常情況下,Python 會自動将使用者指定的 sizehint 的值調整成内部緩存大小的整數倍。</code>

<code>file在python是一個特殊的類型,它用于在python程式中對外部的檔案進行操作。</code>

<code>在python中一切都是對象,file也不例外,file有file的方法和屬性。</code>

<code>下面先來看如何建立一個file對象:</code>

<code>file(name[, mode[, buffering]]) </code>

<code>file()函數用于建立一個file對象,它有一個别名叫open(),可能更形象一些,它們是内置函數。</code>

<code>來看看它的參數。它參數都是以字元串的形式傳遞的。name是檔案的名字。</code>

<code>mode</code>

<code>是打開的模式,可選的值為r w a U,分别代表讀(預設) 寫 </code>

<code>添加支援各種換行符的模式。用w或a模式打開檔案的話,如果檔案不存在,那麼就自動建立。</code>

<code>此外,用w模式打開一個已經存在的檔案時,原有檔案的内容會被清空,</code>

<code>因為一開始檔案的操作的标記是在檔案的開頭的,這時候進行寫操作,無疑會把原有的内容給抹掉。</code>

<code>由于曆史的原因,換行符在不同的系統中有不同模式,比如在 unix中是一個\n,</code>

<code>而在windows中是‘\r\n’,用U模式打開檔案,就是支援所有的換行模式,</code>

<code>也就說‘\r’ </code><code>'\n'</code> <code>'\r\n'</code><code>都可表示換行,會有一個tuple用來存貯這個檔案中用到過的換行符。</code>

<code>不過,雖說換行有多種模式,讀到python中統一用\n代替。在模式字元的後面,</code>

<code>還可以加上+ b t這兩種辨別,分别表示可以對檔案同時進行讀寫操作和用二進制模式、文本模式(預設)打開檔案。</code>

<code>buffering如果為</code><code>0</code><code>表示不進行緩沖;如果為</code><code>1</code><code>表示進行“行緩沖“;如果是一個大于</code><code>1</code><code>的數表示緩沖區的大小,應該是以位元組為機關的。</code>

<code>file對象有自己的屬性和方法。先來看看file的屬性。</code>

<code>closed #标記檔案是否已經關閉,由close()改寫 </code>

<code>encoding #檔案編碼 </code>

<code>mode #打開模式 </code>

<code>name #檔案名 </code>

<code>newlines #檔案中用到的換行模式,是一個tuple </code>

<code>softspace #boolean型,一般為</code><code>0</code><code>,據說用于print</code>

<code>file的讀寫方法:</code>

<code>F.read([size]) #size為讀取的長度,以byte為機關 </code>

<code>F.readline([size]) </code>

<code>#讀一行,如果定義了size,有可能傳回的隻是一行的一部分 </code>

<code>F.readlines([size]) </code>

<code>#把檔案每一行作為一個list的一個成員,并傳回這個list。</code>

<code>其實它的内部是通過循環調用readline()來實作的。如果提供size參數,size是表示讀取内容的總長,</code>

<code>也就是說可能隻讀到檔案的一部分。 </code>

<code>F.write(str) </code>

<code>#把str寫到檔案中,write()并不會在str後加上一個換行符 </code>

<code>F.writelines(seq) </code>

<code>#把seq的内容全部寫到檔案中。這個函數也隻是忠實地寫入,不會在每行後面加上任何東西。 </code>

<code>file的其他方法:</code>

<code>F.close() </code>

<code>#關閉檔案。python會在一個檔案不用後自動關閉檔案,不過這一功能沒有保證,</code>

<code>最好還是養成自己關閉的習慣。如果一個檔案在關閉後還對其進行操作會産生ValueError </code>

<code>F.flush() </code>

<code>#把緩沖區的内容寫入硬碟 </code>

<code>F.fileno() </code>

<code>#傳回一個長整型的”檔案标簽“ </code>

<code>F.isatty() </code>

<code>#檔案是否是一個終端裝置檔案(unix系統中的) </code>

<code>F.tell() </code>

<code>#傳回檔案操作标記的目前位置,以檔案的開頭為原點 </code>

<code>F.next() </code>

<code>#傳回下一行,并将檔案操作标記位移到下一行。把一個file用于</code><code>for</code> <code>... </code><code>in</code> <code>file這樣的語句時,</code>

<code>就是調用next()函數來實作周遊的。 </code>

<code>F.seek(offset[,whence]) </code>

<code>#将檔案打操作标記移到offset的位置。這個offset一般是相對于檔案的開頭來計算的,一般為正數。</code>

<code>但如果提供了whence參數就不一定了,whence可以為</code><code>0</code><code>表示從頭開始計算,</code><code>1</code><code>表示以目前位置為原點計算。</code>

<code>2</code><code>表示以檔案末尾為原點進行計算。需要注意,如果檔案以a或a+的模式打開,每次進行寫操作時,</code>

<code>檔案操作标記會自動傳回到檔案末尾。 </code>

<code>F.truncate([size]) </code>

<code>#把檔案裁成規定的大小,預設的是裁到目前檔案操作标記的位置。如果size比檔案的大小還要大,</code>

<code>依據系統的不同可能是不改變檔案,也可能是用</code><code>0</code><code>把檔案補到相應的大小,也可能是以一些随機的内容加上去。</code>

<code>代碼</code>

<code>#! /usr/bin/python</code>

<code>import</code> <code>os,sys</code>

<code>    </code><code>fsock = open(</code><code>"D:/Python/test.py"</code><code>, </code><code>"r"</code><code>)</code>

<code>except IOError:</code>

<code>    </code><code>print </code><code>"The file don't exist, Please double check!"</code>

<code>    </code><code>exit()</code>

<code>print </code><code>'The file mode is '</code><code>,fsock.mode</code>

<code>print </code><code>'The file name is '</code><code>,fsock.name</code>

<code>P = fsock.tell()</code>

<code>print </code><code>'the postion is %d'</code> <code>%(P)</code>

<code>fsock.close()</code>

<code>#Read file</code>

<code>fsock = open(</code><code>"D:/Python/test.py"</code><code>, </code><code>"r"</code><code>)</code>

<code>AllLines = fsock.readlines()</code>

<code>#Method </code><code>1</code>

<code>for</code> <code>EachLine </code><code>in</code> <code>fsock:</code>

<code>    </code><code>print EachLine</code>

<code>#Method </code><code>2</code>

<code>print </code><code>'Star'</code><code>+</code><code>'='</code><code>*</code><code>30</code>

<code>for</code> <code>EachLine </code><code>in</code> <code>AllLines:</code>

<code>print </code><code>'End'</code><code>+</code><code>'='</code><code>*</code><code>30</code>

<code>#write </code><code>this</code> <code>file</code>

<code>fsock = open(</code><code>"D:/Python/test.py"</code><code>, </code><code>"a"</code><code>)</code>

<code>fsock.write(</code><code>""</code><code>"</code>

<code>#Line </code><code>1</code> <code>Just </code><code>for</code> <code>test purpose</code>

<code>#Line </code><code>2</code> <code>Just </code><code>for</code> <code>test purpose</code>

<code>#Line </code><code>3</code> <code>Just </code><code>for</code> <code>test purpose</code><code>""</code><code>")</code>

<code>#check the file status</code>

<code>S1 = fsock.closed</code>

<code>if</code> <code>True == S1:</code>

<code>    </code><code>print </code><code>'the file is closed'</code>

<code>else</code><code>:</code>

<code>    </code><code>print </code><code>'The file donot close'</code>

     本文轉自Tar0 51CTO部落格,原文連結:http://blog.51cto.com/tar0cissp/1565094,如需轉載請自行聯系原作者