Python 之 文件读写的学习
文件是一个存储在辅助存储器上的数据序列,可以包含任何数据内容,其中包括两种类型:文本文件和二进制文件。文件读写是Python代码调用电脑文件的主要功能,能被用于读取和写入文本记录、音频片段、Excel文档、保存邮件以及任何保存在电脑上的东西。
文件读写
一、文件的打开(Python对文本文件和二进制文件采用统一的操作步骤,即“打开-操作-关闭”。)
(1)通过解释器内置的open()函数打开一个文件,并实现该文件与一个程序变量的关联,open()函数格式如下:
<变量名> = open(<文件路径>, <打开模式>)
可以看到,open()函数有两个参数:
- 文件的保存地址:文件的地址有两种,绝对路径和相对路径。
绝对路径就是文件最完整的路径,相对路径就是相对于当前文件夹的路径,当前文件夹就是你编写的这个py文件所放的文件夹。如果你要打开的文件和open.py在同一个文件夹里,这时只要使用相对路径就行了,而要使用其他文件夹的文件则需使用绝对路径。
不过需要注意的是:\在Python中是转义字符,所以时常会有冲突。为了避坑,Windows的绝对路径通常要稍作处理,写成以下两种形式:
1 open('C:\\Users\\Administrator\\Desktop\\test\\abc.txt') 2 #将'\'替换成'\\' 3 4 open(r'C:\Users\Administrator\Desktop\test\abc.txt') 5 #在路径前加上字母r
- 打开文件时的模式:open()函数提供7种基本的打开模式。
如果想要读取或者写入的数据不是文本内容,而是音频和图片,可以使用‘rb’模式或者‘wb’模式,因为图片和音频是以二进制的形式保存的。
(2)为了避免打开文件后忘记关闭,占用资源或当不能确定关闭文件的恰当时机的时候,我们可以用到关键字with,例如:
1 #使用open()函数 2 f = open('abc.txt', 'a') 3 f.write('abc') 4 f.close() 5 6 #使用关键字with 7 #with open('文件地址','读写模式') as 变量名: 8 9 with open('abc.txt', 'a') as: #注意冒号:不能丢, 而且对文件进行操作时需要缩进 10 f.write('abc') 11 12 #无需用close()关闭
二、文件的读取
Python提供4个常用的文件内容读取方法:
对文件的读取操作需要将文件中的数据加载到内存中,而上面所用到的read()方法会一次性把文件中所有的内容全部加载到内存中,当遇到一个非常大的文件时,会很容易把内存消耗完,显然是不合理的。所以在读取文件时,通常采用下面两种方法,对文件内容进行逐行处理:
1 #使用readlines()函数 2 f = open('abc.txt', 'r') 3 for line in f.readlines(): 4 #处理一行数据 5 f.close() 6 7 #直接遍历文件 8 f = open('abc.txt', 'r') 9 for line in f: 10 #处理一行数据 11 f.close()
三、文件的写入
Python提供3个与文件内容写入有关的方法:
例子如下:
1 ls = ['a', 'b','c'] 2 with open('abc.txt', 'w+') as f: 3 f.writelines(ls) #使用writelines()函数后,文件指针会指在写入内容的后面 4 f.seek(0) #使用seek()函数,将文件指针返回文件开头.如果把这行代码注释掉,后面将不会打印出写入的内容 5 for line in f: 6 print(line)
读取excel文件,修改并存为csv文件
需要读入上面的Excel表格,并且将优秀改为90分,良好80分,合格60,不合格0分,最后存为csv文件。如图可以看到这个表格的数据不是很整齐,下面我会使用pandas库处理这个Excel表格。(pandas库的简单使用)
(1)将原表格处理一下
1 import pandas as pd 2 df = pd.read_excel("Python成绩登记信计.xlsx", header=1) #读入excel文件,创建DataFrame实例 3 df.columns = ['序号','一','二','三','四'] #人为设置columns,就是每一列的名字 4 df.set_index('序号', inplace = True) #因为DataFrame有自己的默认索引,这里设置'序号'作为索引 5 df.to_excel("newexcel.xlsx") #保存为新的Excel文件
得到的新表格如下:
(2)修改excel数据,并存为csv文件
1 import pandas as pd 2 df = pd.read_excel("newexcel.xlsx") 3 chg = {'优秀':'90','良好':'80','合格':'60','不合格':'0'} #创建一个对应成绩的字典 4 Grade = df.columns.values[1:] #取出每一列数据的列名 5 for col in Grade: 6 for i in chg: 7 df[col][df[col] == i] = chg[i] #找到col表示的列名的那一列,在该列进行比较 8 df.to_csv("newcsv.csv", index = False, header = True) #保存为csv文件
得到的csv文件如下:
将csv格式文件转换成html文件
pandas库的DataFrame类提供了比较简单的保存为html文件的方法,如下:
1 import pandas as pd 2 df = pd.read_csv("newcsv.csv") #读入csv文件,创建一个DataFrame实例 3 df.to_html("newhtml.html", index = False, header = True) #保存为html格式文件
打开该html文件后,效果如:
运用Python CGI将上面的csv格式文件在网页上显示
由于接下来需要用到CGI的知识,所以我这里给出简单学习CGI的链接。(Python CGI安装教程及简单使用、修改httpd.conf文件参考教程)
安装以及配置完Apache之后,我将我完成的html文件放入文件夹Apache24/htdocs中,用记事本的形式打开这个html文件,得到:
1 <table border="1" class="dataframe"> 2 <thead> 3 <tr style="text-align: right;"> 4 <th>序号</th> 5 <th>一</th> 6 <th>二</th> 7 <th>三</th> 8 <th>四</th> 9 </tr> 10 </thead> 11 <tbody> 12 <tr> 13 <td>1</td> 14 <td>0.0</td> 15 <td>90.0</td> 16 <td>80.0</td> 17 <td>80.0</td> 18 </tr> 19 <tr> 20 <td>2</td> 21 <td>90.0</td> 22 <td>90.0</td> 23 <td>90.0</td> 24 <td>90.0</td> 25 </tr> 26 <tr> 27 <td>3</td> 28 <td>60.0</td> 29 <td>90.0</td> 30 <td>80.0</td> 31 <td>80.0</td> 32 </tr> 33 <tr> 34 <td>4</td> 35 <td>0.0</td> 36 <td>90.0</td> 37 <td>90.0</td> 38 <td>80.0</td> 39 </tr> 40 <tr> 41 <td>5</td> 42 <td>90.0</td> 43 <td>90.0</td> 44 <td>80.0</td> 45 <td>90.0</td> 46 </tr> 47 <tr> 48 <td>6</td> 49 <td>90.0</td> 50 <td>90.0</td> 51 <td>90.0</td> 52 <td>80.0</td> 53 </tr> 54 <tr> 55 <td>7</td> 56 <td>90.0</td> 57 <td>90.0</td> 58 <td>80.0</td> 59 <td>90.0</td> 60 </tr> 61 <tr> 62 <td>8</td> 63 <td>90.0</td> 64 <td>90.0</td> 65 <td>80.0</td> 66 <td>80.0</td> 67 </tr> 68 <tr> 69 <td>9</td> 70 <td>90.0</td> 71 <td>90.0</td> 72 <td>80.0</td> 73 <td>90.0</td> 74 </tr> 75 <tr> 76 <td>10</td> 77 <td>90.0</td> 78 <td>90.0</td> 79 <td>90.0</td> 80 <td>90.0</td> 81 </tr> 82 <tr> 83 <td>11</td> 84 <td>90.0</td> 85 <td>90.0</td> 86 <td>90.0</td> 87 <td>90.0</td> 88 </tr> 89 <tr> 90 <td>12</td> 91 <td>90.0</td> 92 <td>90.0</td> 93 <td>90.0</td> 94 <td>90.0</td> 95 </tr> 96 <tr> 97 <td>13</td> 98 <td>80.0</td> 99 <td>60.0</td> 100 <td>90.0</td> 101 <td>90.0</td> 102 </tr> 103 <tr> 104 <td>14</td> 105 <td>60.0</td> 106 <td>90.0</td> 107 <td>80.0</td> 108 <td>80.0</td> 109 </tr> 110 <tr> 111 <td>15</td> 112 <td>80.0</td> 113 <td>90.0</td> 114 <td>80.0</td> 115 <td>80.0</td> 116 </tr> 117 <tr> 118 <td>16</td> 119 <td>0.0</td> 120 <td>0.0</td> 121 <td>0.0</td> 122 <td>0.0</td> 123 </tr> 124 <tr> 125 <td>17</td> 126 <td>90.0</td> 127 <td>90.0</td> 128 <td>90.0</td> 129 <td>90.0</td> 130 </tr> 131 <tr> 132 <td>18</td> 133 <td>90.0</td> 134 <td>90.0</td> 135 <td>90.0</td> 136 <td>90.0</td> 137 </tr> 138 <tr> 139 <td>19</td> 140 <td>90.0</td> 141 <td>90.0</td> 142 <td>90.0</td> 143 <td>90.0</td> 144 </tr> 145 <tr> 146 <td>20</td> 147 <td>90.0</td> 148 <td>60.0</td> 149 <td>90.0</td> 150 <td>80.0</td> 151 </tr> 152 <tr> 153 <td>21</td> 154 <td>60.0</td> 155 <td>60.0</td> 156 <td>90.0</td> 157 <td>80.0</td> 158 </tr> 159 <tr> 160 <td>22</td> 161 <td>60.0</td> 162 <td>90.0</td> 163 <td>90.0</td> 164 <td>80.0</td> 165 </tr> 166 <tr> 167 <td>23</td> 168 <td>90.0</td> 169 <td>90.0</td> 170 <td>90.0</td> 171 <td>60.0</td> 172 </tr> 173 <tr> 174 <td>24</td> 175 <td>90.0</td> 176 <td>90.0</td> 177 <td>90.0</td> 178 <td>0.0</td> 179 </tr> 180 <tr> 181 <td>25</td> 182 <td>80.0</td> 183 <td>90.0</td> 184 <td>90.0</td> 185 <td>90.0</td> 186 </tr> 187 <tr> 188 <td>26</td> 189 <td>80.0</td> 190 <td>90.0</td> 191 <td>90.0</td> 192 <td>90.0</td> 193 </tr> 194 <tr> 195 <td>27</td> 196 <td>90.0</td> 197 <td>90.0</td> 198 <td>90.0</td> 199 <td>90.0</td> 200 </tr> 201 <tr> 202 <td>28</td> 203 <td>90.0</td> 204 <td>0.0</td> 205 <td>90.0</td> 206 <td>80.0</td> 207 </tr> 208 <tr> 209 <td>29</td> 210 <td>90.0</td> 211 <td>90.0</td> 212 <td>90.0</td> 213 <td>90.0</td> 214 </tr> 215 <tr> 216 <td>30</td> 217 <td>90.0</td> 218 <td>80.0</td> 219 <td>90.0</td> 220 <td>90.0</td> 221 </tr> 222 <tr> 223 <td>31</td> 224 <td>80.0</td> 225 <td>90.0</td> 226 <td>90.0</td> 227 <td>80.0</td> 228 </tr> 229 <tr> 230 <td>32</td> 231 <td>90.0</td> 232 <td>90.0</td> 233 <td>90.0</td> 234 <td>80.0</td> 235 </tr> 236 <tr> 237 <td>33</td> 238 <td>90.0</td> 239 <td>60.0</td> 240 <td>90.0</td> 241 <td>0.0</td> 242 </tr> 243 <tr> 244 <td>34</td> 245 <td>90.0</td> 246 <td>90.0</td> 247 <td>90.0</td> 248 <td>80.0</td> 249 </tr> 250 <tr> 251 <td>35</td> 252 <td>90.0</td> 253 <td>90.0</td> 254 <td>90.0</td> 255 <td>80.0</td> 256 </tr> 257 <tr> 258 <td>36</td> 259 <td>80.0</td> 260 <td>90.0</td> 261 <td>90.0</td> 262 <td>90.0</td> 263 </tr> 264 <tr> 265 <td>37</td> 266 <td>60.0</td> 267 <td>80.0</td> 268 <td>80.0</td> 269 <td>80.0</td> 270 </tr> 271 <tr> 272 <td>38</td> 273 <td>80.0</td> 274 <td>90.0</td> 275 <td>90.0</td> 276 <td>80.0</td> 277 </tr> 278 <tr> 279 <td>39</td> 280 <td>NaN</td> 281 <td>NaN</td> 282 <td>NaN</td> 283 <td>NaN</td> 284 </tr> 285 <tr> 286 <td>40</td> 287 <td>NaN</td> 288 <td>NaN</td> 289 <td>NaN</td> 290 <td>NaN</td> 291 </tr> 292 </tbody> 293 </table>
打开网页,输入http://localhost/newhtml.html,发现网页出现中文乱码,如下:
接着我在百度找到了解决方法,并且对这个html进行了修改,修改为:
1 <html><meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 2 <title>成绩登记表</title> 3 <head><b>成绩登记表</b></head><br></br> 4 <table border="1" class="dataframe"> 5 <thead> 6 <tr style="text-align: right;"> 7 <th>序号</th> 8 <th>一</th> 9 <th>二</th> 10 <th>三</th> 11 <th>四</th> 12 </tr> 13 </thead> 14 <tbody> 15 <tr> 16 <td>1</td> 17 <td>0.0</td> 18 <td>90.0</td> 19 <td>80.0</td> 20 <td>80.0</td> 21 </tr> 22 <tr> 23 <td>2</td> 24 <td>90.0</td> 25 <td>90.0</td> 26 <td>90.0</td> 27 <td>90.0</td> 28 </tr> 29 <tr> 30 <td>3</td> 31 <td>60.0</td> 32 <td>90.0</td> 33 <td>80.0</td> 34 <td>80.0</td> 35 </tr> 36 <tr> 37 <td>4</td> 38 <td>0.0</td> 39 <td>90.0</td> 40 <td>90.0</td> 41 <td>80.0</td> 42 </tr> 43 <tr> 44 <td>5</td> 45 <td>90.0</td> 46 <td>90.0</td> 47 <td>80.0</td> 48 <td>90.0</td> 49 </tr> 50 <tr> 51 <td>6</td> 52 <td>90.0</td> 53 <td>90.0</td> 54 <td>90.0</td> 55 <td>80.0</td> 56 </tr> 57 <tr> 58 <td>7</td> 59 <td>90.0</td> 60 <td>90.0</td> 61 <td>80.0</td> 62 <td>90.0</td> 63 </tr> 64 <tr> 65 <td>8</td> 66 <td>90.0</td> 67 <td>90.0</td> 68 <td>80.0</td> 69 <td>80.0</td> 70 </tr> 71 <tr> 72 <td>9</td> 73 <td>90.0</td> 74 <td>90.0</td> 75 <td>80.0</td> 76 <td>90.0</td> 77 </tr> 78 <tr> 79 <td>10</td> 80 <td>90.0</td> 81 <td>90.0</td> 82 <td>90.0</td> 83 <td>90.0</td> 84 </tr> 85 <tr> 86 <td>11</td> 87 <td>90.0</td> 88 <td>90.0</td> 89 <td>90.0</td> 90 <td>90.0</td> 91 </tr> 92 <tr> 93 <td>12</td> 94 <td>90.0</td> 95 <td>90.0</td> 96 <td>90.0</td> 97 <td>90.0</td> 98 </tr> 99 <tr> 100 <td>13</td> 101 <td>80.0</td> 102 <td>60.0</td> 103 <td>90.0</td> 104 <td>90.0</td> 105 </tr> 106 <tr> 107 <td>14</td> 108 <td>60.0</td> 109 <td>90.0</td> 110 <td>80.0</td> 111 <td>80.0</td> 112 </tr> 113 <tr> 114 <td>15</td> 115 <td>80.0</td> 116 <td>90.0</td> 117 <td>80.0</td> 118 <td>80.0</td> 119 </tr> 120 <tr> 121 <td>16</td> 122 <td>0.0</td> 123 <td>0.0</td> 124 <td>0.0</td> 125 <td>0.0</td> 126 </tr> 127 <tr> 128 <td>17</td> 129 <td>90.0</td> 130 <td>90.0</td> 131 <td>90.0</td> 132 <td>90.0</td> 133 </tr> 134 <tr> 135 <td>18</td> 136 <td>90.0</td> 137 <td>90.0</td> 138 <td>90.0</td> 139 <td>90.0</td> 140 </tr> 141 <tr> 142 <td>19</td> 143 <td>90.0</td> 144 <td>90.0</td> 145 <td>90.0</td> 146 <td>90.0</td> 147 </tr> 148 <tr> 149 <td>20</td> 150 <td>90.0</td> 151 <td>60.0</td> 152 <td>90.0</td> 153 <td>80.0</td> 154 </tr> 155 <tr> 156 <td>21</td> 157 <td>60.0</td> 158 <td>60.0</td> 159 <td>90.0</td> 160 <td>80.0</td> 161 </tr> 162 <tr> 163 <td>22</td> 164 <td>60.0</td> 165 <td>90.0</td> 166 <td>90.0</td> 167 <td>80.0</td> 168 </tr> 169 <tr> 170 <td>23</td> 171 <td>90.0</td> 172 <td>90.0</td> 173 <td>90.0</td> 174 <td>60.0</td> 175 </tr> 176 <tr> 177 <td>24</td> 178 <td>90.0</td> 179 <td>90.0</td> 180 <td>90.0</td> 181 <td>0.0</td> 182 </tr> 183 <tr> 184 <td>25</td> 185 <td>80.0</td> 186 <td>90.0</td> 187 <td>90.0</td> 188 <td>90.0</td> 189 </tr> 190 <tr> 191 <td>26</td> 192 <td>80.0</td> 193 <td>90.0</td> 194 <td>90.0</td> 195 <td>90.0</td> 196 </tr> 197 <tr> 198 <td>27</td> 199 <td>90.0</td> 200 <td>90.0</td> 201 <td>90.0</td> 202 <td>90.0</td> 203 </tr> 204 <tr> 205 <td>28</td> 206 <td>90.0</td> 207 <td>0.0</td> 208 <td>90.0</td> 209 <td>80.0</td> 210 </tr> 211 <tr> 212 <td>29</td> 213 <td>90.0</td> 214 <td>90.0</td> 215 <td>90.0</td> 216 <td>90.0</td> 217 </tr> 218 <tr> 219 <td>30</td> 220 <td>90.0</td> 221 <td>80.0</td> 222 <td>90.0</td> 223 <td>90.0</td> 224 </tr> 225 <tr> 226 <td>31</td> 227 <td>80.0</td> 228 <td>90.0</td> 229 <td>90.0</td> 230 <td>80.0</td> 231 </tr> 232 <tr> 233 <td>32</td> 234 <td>90.0</td> 235 <td>90.0</td> 236 <td>90.0</td> 237 <td>80.0</td> 238 </tr> 239 <tr> 240 <td>33</td> 241 <td>90.0</td> 242 <td>60.0</td> 243 <td>90.0</td> 244 <td>0.0</td> 245 </tr> 246 <tr> 247 <td>34</td> 248 <td>90.0</td> 249 <td>90.0</td> 250 <td>90.0</td> 251 <td>80.0</td> 252 </tr> 253 <tr> 254 <td>35</td> 255 <td>90.0</td> 256 <td>90.0</td> 257 <td>90.0</td> 258 <td>80.0</td> 259 </tr> 260 <tr> 261 <td>36</td> 262 <td>80.0</td> 263 <td>90.0</td> 264 <td>90.0</td> 265 <td>90.0</td> 266 </tr> 267 <tr> 268 <td>37</td> 269 <td>60.0</td> 270 <td>80.0</td> 271 <td>80.0</td> 272 <td>80.0</td> 273 </tr> 274 <tr> 275 <td>38</td> 276 <td>80.0</td> 277 <td>90.0</td> 278 <td>90.0</td> 279 <td>80.0</td> 280 </tr> 281 <tr> 282 <td>39</td> 283 <td>NaN</td> 284 <td>NaN</td> 285 <td>NaN</td> 286 <td>NaN</td> 287 </tr> 288 <tr> 289 <td>40</td> 290 <td>NaN</td> 291 <td>NaN</td> 292 <td>NaN</td> 293 <td>NaN</td> 294 </tr> 295 </tbody> 296 </table> 297 </html>
最后结果为: