python 环境
mac自带的是2.7,首先需要升级到python3
使用homebrew升级,先安装Homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
然后使用brew install
brew install python3
查看python3 --version 是 3.7.4
我用的编译器是VSCode,不知道为什么要求装pip
sudo easy_install pip
如果要在 VSCode 里面直接运行 python,需要选择对应的 python interpreter(否则默认用的是python 2)
方法文档理由说明,如下
From within VS Code, select a Python 3 interpreter by opening the Command Palette(⇧⌘P), start typing the Python: Select Interpreter command to search, then select the command.
做完这些,终于可以运行成功了,之前是python2,会不认识encoding这个参数
读取文件三步
open - read - close
打开
三个参数:绝对路径,权限,编码方式
file1 = open('/Users/lesliepeng/Desktop/test/abc.txt','r',encoding='utf-8')
读取
read
关闭
file.close()
同时能打开的文件数量有限,所以需要close
写入文件三步
file1 = open('/Users/lesliepeng/Desktop/test/abc.txt','w',encoding='utf-8')
file1.write('张无忌n')
file1.write('杨逍n')
打开文件看一下,发现文件内容被重写了,之前的赵敏周芷若没有了
'w'写入模式会给你暴力清空掉文件,然后再给你写入。如果你只想增加东西,而不想完全覆盖掉原文件的话,就要使用'a'模式,表示append。
最后一步还是要关闭close
问题
是不是要先print再close ?可是内容不是已经存在content里了吗。。
这里再顺便补充一个用法,为了避免打开文件后忘记关闭,占用资源或当不能确定关闭文件的恰当时机的时候,我们可以用到关键字with,之前的例子可以写成这样:
# 普通写法
file1 = open('abc.txt','a')
file1.write('张无忌')
file1.close()
# 使用with关键字的写法
with open('abc.txt','a') as file1:
#with open('文件地址','读写模式') as 变量名:
#格式:冒号不能丢
file1.write('张无忌')
#格式:对文件的操作要缩进
#格式:无需用close()关闭
练习
文件adb.txt
罗恩 23 35 44
哈利 60 77 68 88 90
赫敏 97 99 89 91 95 90
马尔福 100 85 90
需要统计他们的总分然后存在另一个文件里
使用 readlines() 可以一行一行的读取文件内容,并存储为一个数组
file1 = open('/Users/lesliepeng/Desktop/test/abc.txt','r',encoding='utf-8')
content = file1.readlines()
file1.close()
print(content)
打印看结果
['罗恩 23 35 44n', '哈利 60 77 68 88 90n', '赫敏 97 99 89 91 95 90n', '马尔福 100 85 90']
然后我们可以遍历每一个数组成员,将里面的字符拆出来,需要用到一个字符串方法叫做 split()
for i in file_lines:
data =i.split()
如果打印每一个data
['罗恩', '23', '35', '44']
['哈利', '60', '77', '68', '88', '90']
['赫敏', '97', '99', '89', '91', '95', '90']
['马尔福', '100', '85', '90']
然后就可以再遍历每一个data,把第一位以后的都加起来算总分,注意数据类型的转换:
sum = 0 #先把总成绩设为0
for score in data[1:]: #遍历列表中第1个数据和之后的数据
sum = sum + int(score)
总的代码
file = open('/Users/Ted/Desktop/scores.txt','r',encoding='utf-8')
file_lines = file.readlines()
file.close()
final_scores = []
for i in file_lines:
data =i.split()
sum = 0
for score in data[1:]:
sum = sum + int(score)
result = data[0]+str(sum)+'n'
final_scores.append(result)
winner = open('/Users/Ted/Desktop/winner.txt','w',encoding='utf-8')
winner.writelines(final_scores)
winner.close()
16行的代码是以writelines()的方式写进去,为什么不能用write()?因为final_scores是一个列表,而write()的参数必须是一个字符串,而writelines()可以是序列,所以我们使用writelines()。
自己一开始比较麻烦的解法
file1 = open('/Users/lesliepeng/Desktop/test/abc.txt','r',encoding='utf-8')
content = file1.readlines()
file1.close()
score=['']
for i in content:
data = i.split()
#print(data)
sum = 0
for num in data[1:]:
sum = sum+int(num)
#print(sum)
stu = ['']
stu[0]=data[0]
stu.append(str(sum))
#print(stu)
file2 = open('/Users/lesliepeng/Desktop/test/score.txt','a',encoding='utf-8')
a=''
b=a.join(stu)
file2.write(b)
file2.close()
其实是可以直接用加号拼接字符串的,可见字符串的拼接没有掌握好