30天学会 Python: Day 10-读进来!写出去!

绝对路径&相对路径

电脑中所有的档案和目录(资料夹)形成一个树状的结构
一个目录下可以有多个目录和档案,所有的档案和目录由根目录为起点开始分支

路径是电脑中用来表示档案或目录位置的方法,有两种表示法:

  • 绝对路径
    根目录 开始,某个 档案目录 结束的路径
    Windows 的根目录是硬碟磁区 (C:\ , D:\ ...),Linux / macOS 的根目录是 /
    以 Windows 为例:
    • 桌面的绝对路径是 C:\Users\<使用者名称>\Desktop
    • 桌面上的相片 dog.jpg 的绝对路径是 C:\Users\<使用这者名称>\Desktop\dog.jpg
    • 桌面上的资料夹 catsC:\Users\<使用者名称>\Desktop\cats
  • 相对路径
    某档案或某目录(资料夹)相对於目前目录的路径
    以 Windows 为例,假设桌面上有一个文字档案 a.txt,和一个资料夹 pictures,资料夹中有三张图片, dog.jpg, cat.jpg, apple.png,那对桌面这个目录来说:
    • a.txt 对於桌面的相对路径是 a.txtpictures 对於桌面的相对路径是 pictures
    • pictures 中相片对於桌面的相对路径是 pictures\dog.jpg, pictures\cat.jpgpictures\apple.png

在 Windows,路径中的目录以反斜线 \ 分隔,Linux / macOS 以斜线 / 分隔

文字档案读写

变数的数值在程序结束後就会不见,若要将程序执行的结果储存起来供下次执行时使用,必须将要储存的资料存在档案中
Python 中档案读写的功能可以处理各类型的档案,但纯文字类型的处理比较简单,所以这篇只会介绍文字档案读写

开启档案

open(name, mode) 开起档名是 name 的档案,可以用相对路径或绝对路径表示,参数 mode 是档案开启的模式,以字串表示,常用的有:

  • 'r': 唯读,只能读取其中的资料
  • 'r+': 读写,可以读取并写入资料,新写入的内容会在档案的开头
  • w: 写入,如果档案不存在会建立新档案,如果档案存在原先的内容会被删除
  • 'a': 写入,如果档案不存在会建立新档案,如果档案存在不会删除原先的内容,新的内容会加在档案的最後

开启和程序码档案同个资料夹中的 data.txt
档案使用完要用 close() 将档案关闭以档案损毁

f = open('data.txt', 'r')
f.close()

或是

with open('data.txt', 'r') as f:

被开启的档案会在使用完後自动关闭

读取档案

read()

回传一个字串,包含档案中的所有内容

先在同个资料夹中建立 data.txt,内容是

Hello, world!!!
Today is the 10th day.

read() 读取其中的内容

f = open('data.txt', 'r')
contain = f.read()
print(contain)
f.close()

with open('data.txt', 'r') as f:
	contain = f.read()
	print(contain)

可以指定指读取前几个字

with open('data.txt', 'r') as f:
	contain = f.read(5)
	print(contain)

readline()

回传一个字串,是档案的第一行(包含换行符号)

with open('data.txt', 'r') as f:
	contain = f.readline()
	print(contain)

readlines()

回传一个串列,里面的一个元是档案中的一行

with open('data.txt', 'r') as f:
	contain = f.readlines()
	print(contain)

可以只读取前几行

with open('data.txt', 'r') as f:
	contain = f.readlines(1)
	print(contain)

写入档案

write() 可以把字串写入档案中

如果档案开启的模式是 r+,会从档案的开头开始写入,原先的内容会被覆盖
如果再用 read() 读取内容,会发现前面几个字被删除

with open('data.txt', 'r+') as f:
	f.write('123')
	contain = f.read()
	print(contain)

但实际上档案的前三个字已经变成123,让档案关闭後再读取一次,才能看到写入的内容

with open('data.txt', 'r+') as f:
	f.write('123')
with open('data.txt', 'r') as f:
	print(f.read())

如果用 w 模式开启,原先的内容会先被清空

with open('data.txt', 'w') as f:
	f.write('123')
with open('data.txt', 'r') as f:
	print(f.read())

如果要写入的档案不存在时会新增档案,所以可以搭配回圈大量且自动的产生档案

for i in range(1, 6):
	f = open('data_'+str(i)+'.txt', 'w')
	f.close()

如果用 a 模式开启,原先的内容会保留

with open('data.txt', 'a') as f:
	f.write('123')
with open('data.txt', 'r') as f:
	print(f.read())

应用

因为只能写入和读取字串,所以储存数值时要先把资料转换成字串
,读取数值时需要把字串转成其他型态

从档案中读取数值,经过计算後再把数值存回档案中

with open('data.txt', 'r') as file:
	value=file.read()

value=int(value)
value+=10
value**=2

with open('data.txt', 'w') as file:
	file.write(str(value))

如果档案中一行只有一个数值,可以用 readlines() 读取数值,储存时用回圈将数值一笔一笔写入,因为写入资料时不会自动换行,所以还需要写入一个 '\n'

with open('data.txt', 'r') as file:
	values=file.readlines()

for i in range(len(values)):
	values[i]=int(values[i])

with open('data.txt', 'w') as file:
	for value in values:
		file.write(str(value))
		file.write('\n')

一行中有多个数值,每个数值用空格或其他符号分隔,可以用字串的 split() 分割字串

如果 data.txt 长这样

123 23 456 3 45

那读取和写入时可以写成

with open('data.txt', 'r') as file:
	values=file.read()

values = values.split()
for i in range(len(values)):
	values[i]=int(values[i])

with open('data.txt', 'w') as file:
	for value in values:
		file.write(str(value))
		file.write(' ')

<<:  30天学会C语言: Day 10-你的字串不是字串

>>:  【Day 11】- 还在 PTT 点击已满 18 岁? 带上 cookies 吧!(实战 PTT 爬虫 1/3)

排线相机

还记得之前我装了个相机吗? 当初很害怕地把它组装上去,就怕插错或是折到排线,以至於他不能正常动作 那...

为什麽是每90天要改密码?

星期天上午,小明接到主管的电话,说他寄了一封重要的email到小明的信箱。小明赶忙开手机收信,哇!?...

[2021铁人赛 Day15] General Skills 12

引言 昨天使用到 strings 与 grep 这两个工具, 主要是用来寻找一堆资料中的字串的。 ...

【在 iOS 开发路上的大小事-Day24】Firebase 的两个资料库介绍

Firebase 提供了两种资料库供我们做使用,分别是 Realtime Database、Clou...

OpenStack Neutron 介绍 — Linux Bridge - Self-Service Networks

本系列文章同步发布於笔者网站 上篇介绍了 Linux Bridge with Provider Ne...