文章目录
1 读取文本文件
数据几乎无一例外地是被保存在文件中的,可能是文本文件、CSV 文件、Excel文件或其他类型的文件。
你需要告诉Python,脚本要处理何种类型的文件。你可以在程序中写死文件名称。如果这样的话,就不能使用这个程序处理多个不同的文件了。
读取多个不同文件的方法是:在命令行窗口或终端窗口的命令行中,在Python 脚本的名字后面加上完整的文件路径名。要使用这种方法,需要在脚本开始时导入内置的sys
模块。在脚本上方加上import sys
语句之后,就可以在脚本中使用sys
模块提供的所有功能了:
from math import exp,log,sqrt
import re
from datetime import date,time,datetime,timedelta
from operator import itemgetter
import sys
导入了sys
模块之后,你就可以使用argv
这个列表变量了。这个变量捕获了传递给Python脚本的命令行参数列表,即你在命令行中的所有输入,包括你的脚本名称。和任何其他列表一样,argv
也有索引。
argv[0]
:脚本名称argv[1]
:命令行中传递给脚本的第一个附加参数,在这个例子中,就是first_script.py
将要读取的文件路径名。
1.1 创建文本文件
要读取一个文本文件,首先要创建它:
- 打开IDE或文本编辑器(如windows系统下的Notepad、Notepad++、Sublime Text;macOS 系统下的TextMate、TextWrangler、Sublime Text);
- 在文本中写入下面6行,并保存到桌面,存为file_to_read.txt:
I'm
already
much
better
at
Python.
3. 在first_script.py中写入几行代码如下:
# first_script.py
# 读取文件
from math import exp,log,sqrt
import re
from datetime import date,time,datetime,timedelta
from operator import itemgetter
import sys
# 读取单个文本文件
# sys.argv列表获取了要读取的文件的路径名
input_file=sys.argv[1]
print('Output:')
# 创建filereader文件对象,‘r’只读模式
filereader=open(input_file,'r')
for row in filereader:
print(row.strip())
# 完成逐行读取后,关闭文件对象
filereader.close()
- 要读取刚创建的文本文件,输入如下命令:
python first_script.py file_to_read.txt
1.2 脚本和输入文件 在&不在 同一位置
因为first_script.py
和file_to_read.txt
在同一位置,即都在桌面上,所以简单地输入python first_script.py file_to_read.txt
是可以的。
如果文本文件和脚本不在同一位置,就需要输入文本文件的完整路径名,这样脚本才能知道去哪里寻找这个文件。例如,如果文本文件在你的Documents
文件夹中,而不是在桌面上,那么你可以在命令行中使用下面的路径名来从其所处位置读取文本文件:
python first_script.py "C:\Users\[Your Name]\Documents\file_to_read.txt"
1.3 读取文件的新型语法
前面讲的用来创建filereader
对象的那行代码是创建文件对象的传统方法。从Python 2.5 开始,你可以使用with 语句来创建文件对象。这种语法在with
语句结束时会自动关闭文件:
# first_script.py
# 读取文件
from math import exp,log,sqrt
import re
from datetime import date,time,datetime,timedelta
from operator import itemgetter
import sys
# 读取单个文本文件
# sys.argv列表获取了要读取的文件的路径名
input_file=sys.argv[1]
print('Output:')
# 创建filereader文件对象,‘r’只读模式
# 完成逐行读取后,自动关闭文件对象
with open(input_file,'r',newline='') as filereader:
for row in filereader:
print(row.strip())
1.4 使用glob读取多个文件
glob
模块之所以功能强大,是因为它处理的是文件夹,它处理目录,不是单个的文件。
读取多个文件的一种方法:在命令行中将包含输入文件目录的路径名写在Python 脚本名称之后。要使用这种方法,你需要在脚本开头导入内置的os
模块和glob
模块。
当导入了
os
模块之后,你就可以使用它提供的若干种路径名函数了。例如,
os.path.join
函数可以巧妙地将一个或多个路径成分连接在一起。
glob
模块可以找出与特定模式相匹配的所有路径名。
os
模块和glob
模块组合在一起使用,可以找出符合特定模式的某个文件夹下面的所有文件。
首先创建另一个txt,其余步骤如下:
- 打开IDE或文本编辑器(如windows系统下的Notepad、Notepad++、Sublime Text;macOS 系统下的TextMate、TextWrangler、Sublime Text);
- 在文本中写入下面6行,并保存到桌面,存为another_file_to_read.txt:
This
text
comes
from
a
different
text
file.
- 在first_script.py中写入几行代码如下:
# first_script.py
# 读取文件
from math import exp,log,sqrt
import re
from datetime import date,time,datetime,timedelta
from operator import itemgetter
import sys
import glob
import os
# 读取多个文本文件
# sys.argv列表获取了要读取的文件的路径名
input_Path=sys.argv[1]
print('Output:')
# 创建filereader文件对象,‘r’只读模式
# 完成逐行读取后,自动关闭文件对象
for input_file in glob.glob(os.path.join(input_Path,'*.txt')):
with open(input_file,'r',newline='') as filereader:
for row in filereader:
print(row.strip())
- 要读取刚创建的文本文件,输入如下命令:
python first_script.py "d:\desktop"
1.5 小结
学会这项技术的一个巨大好处是它可以规模化扩展。
这个示例只是处理两个文本文件,但是它可以轻松地扩展为处理几十、几百或者几千甚至更多的文件。学习了如何使用glob.glob
函数,仅花费手动处理的一小部分时间,就可以处理非常非常多的文件。
2 写入文件
2.1 写入文本文件
Python 提供了两种简单的方法来将输出写入 文本文件 和 分隔符文件。
write
方法可将单个字符串写入一个文件writelines
方法可将一系列字符串写入一个文件
下面的两个示例,使用range
函数和len
函数跟踪一个列表中的索引值。
在这个例子中,变量my_letters
是一个字符串列表。这里想把这些字母打印到一个文本文件中,每个字母之间用制表符分隔。这个示例中的难点是确保在字母之间以制表符分隔,并在最后一个字母后面放上一个换行符(不是制表符)。
步骤如下:
- 打开IDE或文本编辑器(如windows系统下的Notepad、Notepad++、Sublime Text;macOS 系统下的TextMate、TextWrangler、Sublime Text);
- 在first_script.py中写入几行代码如下:
# first_script.py
# 写入文件
import sys
# 写入文件
# 写入一个文本文件
my_letter=['a','b','c','d','e']
max_index=len(my_letter)
output_file=sys.argv[1]
filewriter=open(output_file,'w')
for index_value in range(len(my_letter)):
if index_value < (max_index-1):
filewriter.write(my_letter[index_value]+'\t')
else:
filewriter.write(my_letter[index_value]+'\n')
filewriter.close()
print('Output:Output written to file')
- 要写入文本文件,输入如下命令:
python first_script.py "d:\desktop\write_to_file.txt"
2.2 写入CSV文件
这个示例与前面的示例非常相似,但是它说明了如何向已经存在的输出文件中追加内容,以及如何将列表中的非字符串数据转换成字符串。
步骤如下:
- 打开IDE或文本编辑器(如windows系统下的Notepad、Notepad++、Sublime Text;macOS 系统下的TextMate、TextWrangler、Sublime Text);
- 在first_script.py中写入几行代码如下:
# first_script.py
# 写入文件
import sys
# 写入CSV文件
# 写入一个文本文件
my_num=[1,2,3,4,5]
max_index=len(my_num)
output_file=sys.argv[1]
# 向已存在的文件追加内容,'a'
filewriter=open(output_file,'a')
for index_value in range(len(my_num)):
if index_value < (max_index-1):
# 非字符串数据转换成字符串
filewriter.write(str(my_num[index_value])+',')
else:
filewriter.write(str(my_num[index_value])+'\n')
filewriter.close()
print('Output:Output written to file')
- 要写入文本文件,输入如下命令:
python first_script.py "d:\desktop\write_to_file.txt"
最后,这个示例演示了一个写入CSV 文件的有效方法。
实际上,在前面的例子中,你将由制表符分隔的数据写入了输出文件,如果将制表符改为逗号,并且将输出文件命名为write_to_file.csv
而不是write_to_file.txt
的话,就可以创建一个CSV 文件。
# first_script.py
# 写入文件
import sys
# 写入文件
# 写入一个文本文件
my_letter=['a','b','c','d','e']
max_index=len(my_letter)
output_file=sys.argv[1]
filewriter=open(output_file,'w')
for index_value in range(len(my_letter)):
if index_value < (max_index-1):
filewriter.write(my_letter[index_value]+',') # 1.改成逗号
else:
filewriter.write(my_letter[index_value]+'\n')
filewriter.close()
print('Output:Output written to file')
python first_script.py "d:\desktop\write_to_file.csv" # 2.改成csv