分解动作1:打开文件
Python 打开文件 的时候需要用到 open()函数 ,其具体的使用语法如下:open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
每个参数的解释说明如下:file is either a text or byte string giving the name (and the path if the file isn't in the current working directory) of the file to be opened or an integer file descriptor of the file to be wrapped.
mode is an optional string that specifies the mode in which the file is opened.
buffering is an optional integer used to set the buffering policy.
encoding is the name of the encoding used to decode or encode the file.
errors is an optional string that specifies how encoding errors are to be handled---this argument should not be used in binary mode.
newline controls how universal newlines works (it only applies to text mode).
If closefd is False, the underlying file descriptor will be kept open when the file is closed.
A custom opener can be used by passing a callable as *opener*.
'r'- open for reading (default)
'w'- open for writing, truncating the file first
'x'- create a new file and open it for writing
'a'- open for writing, appending to the end of the file if it exists
'b'- binary mode
't'- text mode (default)
'+'- open a disk file for updating (reading and writing)
'U'- universal newline mode (deprecated)
【用open()函数造句】:f = open("/file/c/data.txt", mode='r')
代码释义:打开位于/file/c的data.txt文件,打开模式为可读。
这样一个文件就被打开啦~打开后的文件需要赋值一个变量,接下来只要从这个变量里循环读取文本就可以了。分解动作2:读取文本
打开文件后接下来读取文件,其解决办法是用 for循环读取文件 。for循环语法如下:for iterating_var in sequence:
statements(s)
【for循环造句】:
for line in f: (……) 代码释义 :从f中循环读取,每迭代一行,变量为line。分解动作3:处理文本
读取文件的具体内容如下: 读取文件截图 处理文本方式有多种,如处理开头或空行、去掉每行末尾换行符、对每行“切分”处理、整理追加元素等。本文介绍常见的4种方式。 step 1、是否处理开头 关于文本开头的处理,如首行以“#”开头、文本中有空行、需要跳过某些指定行等。这里需要用到 if条件句 对其进行处理,其使用语法如下:if 判断条件1:
执行语句1……
elif 判断条件2:
执行语句2……
elif 判断条件3:
执行语句3……
else:
执行语句4……
if条件句的逻辑是:如果判断条件1为True,则执行“执行语句1”的代码;如果条件判断1为False,则执行elif的判断条件2,以此类推。当判断条件1-3均不满足时,则执行else的“执行语句4”。
【if条件句造句】:
if line.startswith("#") or line.strip() == '':
continue
代码释义
:如果每行以“#”开头,或者有空行,则跳过该行,进入下一个循环,读取下一行。
*知识点*
1、
startswith()
表示以…开头。同理,以…结尾用endswith()表示。
2、
strip()
表示去掉开头或末尾指定字符,默认字符为换行符\n或空格。
3、
continue
表示跳出本次循环,进入下一循环。扩展知识:break,表示跳出整个循环,即终止循环。
如果不用strip()的话,你得到的每行实际是两行,即原来的文本行+1个新空行。大家可以自行测试一下。
不加strip()将得到文本行+空行
也许你会好奇,为什么是line.strip()或者line.startswith(),为什么变量和函数用“.”连接?因为这是针对这个变量的操作,也就是仅对line变量进行strip()或startswith()操作,而不是其他变量。
step 2、拆分每行
基本思路:将每行按照分隔符拆分,将拆分后的元素存储在数组中。
拆分
用到的函数是
split()
,括号内可以提供具体分隔符,如'\t'制表符等。
【split()造句】:
array = line.strip().split('\t')
代码释义:先将变量line去掉\n换行符(由strip()操作),再将变量line按照\t的分隔符进行切片操作(由split()操作),将“切”下来的每个元素存储到变量array的数组中。这里数组表示列表(list)的意思。
也许你会问能不能将line.strip().split()写成line.split().strip()呢?建议不要这样写,因为python是从左向右读取代码并执行操作的。一般先要将每行句尾换行符去掉再进行“切片”操作。
step 3、定义数组元素
我们将上面数组array中的某个元素提出来,将其赋值为我们需要的变量,如变量province等。
【变量赋值造句】:
province = array[0]
代码释义:数组中的元素索引(index)从0开始,即array[0]表示array数组中的第一个元素,将其赋值给变量province。
step 4、将新元素追加到列表中
我们会事先定义一个空列表,告诉python这个变量是列表,目的是处理文本后将拆分的元素追加到这个事先定义的列表中,便于我们后续处理,如在地图展示人数统计中提供了provinces和values两个列表变量进行作图。参见文章
pyecharts可视化地图区域人数统计
。
将元素追加或
添加到列表末尾
的函数是
append()
,其使用语法为:
list.append(obj)
*obj表示object,即添加到列表末尾的对象。
【append()造句】:
provinces.append(province)
代码释义:将变量province追加到列表provincs的末尾,当然事先需要定义provinces=[]。[]中括号表示列表。
连贯动作:打开文件+读取文件+处理文本
Python代码如下:provinces = []values = []file = "/file/cc/data.txt"f = open(file, mode='r')for line in f: if line.startswith('地域') or line.strip() == '': continue array = line.strip().split('\t') province = array[0] value = array[1] provinces.append(province) values.append(value) print(provinces)
可以print一下看看输出的列表是不是你想要的。温馨提示:写完代码立即测试是很有必要的哟~
总结
其实原来我是用perl读取和处理文件的,但无论用perl还是python,处理问题的基本思路是一致的: 打开文件->循环读取文件->跳过开头等->去掉每行的换行符->以\t分隔符split每行存储到数组->赋值变量->添加到数组。 特意总结一个perl vs python的表格,仅针对读取文件方面哈! 表 读取文件比较(python vs perl)item | python | perl |
打开文件 | open()函数 | open IN句柄 |
示例:f=open("/file/c/data.txt",mode='r') | 示例:open IN, " | |
读取文件 | for循环 | while循环 |
示例:for line in f: | 示例:while() { … } | |
跳过该行,进入下一行 | continue | next |
去掉行尾换行符\n | line.strip() | chomp $line; |
切开每行 | array=line.strip().split('\t') | my @arr=split /\t/, $line; |
数组元素赋值 | p=array[0] | $p=$arr[0] |
数组末尾追加元素 | list.append('obj') | push @arr, $p; |
数组名称 | list列表 | arr数组 |
打印变量 | print(p) | print "$p"; |