Jimmy那些事儿

Python_文件与目录操作_OS

Python_导入导出

目录与文件操作 - OS模块

目录操作

“./” 表示当前目录

“../“ 表示上一目录

Windows 中路径需要两个\\ 如下为示例:

E:\\my_computer\\1_工作学习


getcwd & os.chdir - 工作目录

  • os.getcwd() 函数得到当前工作目录,即当前Python脚本工作的目录路径。
  • os.chdir(dirname): 改变工作目录到dirname


listdir - 文件与目录名

  • os.listdir() 返回指定目录下的所有文件和目录名
1
2
3
4
5
6
# 返回当前目录下的文件名
os.listdir()
os.listdir('./')
# 返回上一目录下的文件名
os.listdir('../')


目录结构

1
2
3
4
5
6
7
8
9
> # 参考
> ## 工作目录为 /Users/ethan/coding/python
>
> Users/ethan
> └── coding
> └── python
> ├── hello.py - 文件
> └── web - 目录
>


path.abspath - 绝对路径

  • os.path.abspath(file) :获取文件或目录绝对路径
  • os.path.abspath(‘.’) :获取当前目录的绝对路径
1
2
3
4
5
6
7
# 文件的绝对绝对路径
os.path.abspath('hello.py')
'/Users/ethan/coding/python/hello.py'
# 文件夹的绝对路径
os.path.abspath('web')
'/Users/ethan/coding/python/web'


path.dirname - 文件路径

  • os.path.dirname(path):获取文件或文件夹所在的路径

对比os.path.abspath hellp.py 得到的结果不同;

1
2
3
4
5
6
7
# 获取文件所在的路径
os.path.dirname('/Users/ethan/coding/python/hello.py')
'/Users/ethan/coding/python'
# 获取文件夹的路径
os.path.dirname('/Users/ethan/coding/python')
'/Users/ethan/coding'


path.basename - 文件名称

  • os.path.basename(path):获取文件名或文件夹名
1
2
3
4
5
6
7
# 从一个 绝对路径 中获取该 [文件] 的名称
os.path.basename('/Users/ethan/coding/python/hello.py')
'hello.py'
# 从一个 绝对路径 中获取该 [文件夹] 的名称
os.path.basename('/Users/ethan/coding/python')
'python'


path.split - 目录与文件名

  • os.path.split(path):获取分离后的目录与文件名
1
2
3
4
5
6
7
# 获取分离后的目录与文件名
os.path.split('/Users/ethan/coding/python/hello.py')
('/Users/ethan/coding/python', 'hello.py')
# 获取分离后的目录与文件夹名
os.path.split('/Users/ethan/coding/python')
('/Users/ethan/coding', 'python')


path.splitext - 分离

  • os.path.splitext(path):分离文件名与扩展名

事实上,如果你完全使用目录,它也会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在

1
2
3
4
5
6
# 获取分离后的文件名与扩展名
os.path.splitext('/Users/ethan/coding/python/hello.py')
('/Users/ethan/coding/python/hello', '.py')
os.path.splitext('/Users/ethan/coding/python')
('/Users/ethan/coding/python', '')


path.join - 连接

  • os.path.join(path, name) :连接目录与文件名或目录


####walk - 遍历

  • os.walk() 遍历目录常用的模块,它返回一个包含 3 个元素的元祖:(dirpath, dirnames, filenames)。

dirpath 是以 string 字符串形式返回该目录下所有的绝对路径

dirnames 是以列表 list 形式返回每一个绝对路径下的文件夹名字

filesnames 是以列表 list 形式返回该路径下所有文件名字

1
2
3
4
for root, dirs, files in os.walk('/Users/ethan/coding'):
print root
print dirs
print files


path.sidir - 判断目录

  • os.path.isdir(name): 判断name是不是目录,不是目录就返回false


path.exists - 判断存在

  • os.path.exists(name) :判断是否存在文件或目录name


path.isfile - 判断存在

  • os.path.isfile(name) :判断name这个文件是否存在,不存在返回false


mkdir - 创建

  • os.mkdir(‘file’) :创建目录


rename - 重命名

  • os.rename(“oldname”,”newname”) :重命名文件(目录)



文件操作


moknod - 创建

  • os.moknod(‘text.txt’) : 创建空文件


remove - 移除

  • os.remove():函数用来删除一个文件


open - 打开

要以任何方式打开文件(即使是打印文档),都必须先打开文件,这样才能访问它。

读取文本文件时,Python将其中的所有文本都解读为字符串。如果你读取的是数字,需要转为int/float

  • open(file, [w]) :以某种方式打开文件
  • with open(file, [w]) : with 关键字不再需要访问文件后将其关闭的操作;会自动关闭

r - 只读模式

w - 只写模式。覆盖之前的同名文件(即删除里面的所有内容)。如果文件不存在就创建文件

a - 追加模式打开。附加到现有文件;若文件不存在则创建一个;添加到文件末尾

r+ - 读写模式

w+ 以读写模式打开
a+ 以读写模式打开
rb 以二进制读模式打开
wb 以二进制写模式打开 (参见 w )
ab 以二进制追加模式打开 (参见 a )
rb+ 以二进制读写模式打开 (参见 r+ )
wb+ 以二进制读写模式打开 (参见 w+ )
ab+ 以二进制读写模式打开 (参见 a+ )


read - 读取

要以任何方式打开文件(即使是打印文档),都必须先打开文件,这样才能访问它。

读取文本文件时,Python将其中的所有文本都解读为字符串。如果你读取的是数字,需要转为int/float

  • 所谓字符串,是指可以在内部查找的文档格式。
  • tb0.realine(): 读取第一行的数据,以 ( 字符串str ) 形式返回文件数据 ; 此时源数据 tb0已经缺少了第一行的数据
  • tb0.readlines():按行读取所有的数据,以[ 列表list ],准确的说包含字符串str的列表list,并且也包含换行符(\n),制表符(\t) 形式返回文件数据
  • tb0.read() :一次性读取所有数据,类型为 ( 字符串str )
    • 末尾多一行空行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
with open('filename.csv') as tb01: # with 关键字不再需要访问文件后将其关闭的操作;会自动关闭
a = tb01.readline() # 此时源数据tb01已经缺少了第一行的数据
b = tb01.readlinse()
c = tb01.read() # 此时已经为空
# ----【 重要概念 】--------------------------------------
b[0] # 获得列表中的第一个字符串 '003888800000798,160999900163133\n'
b[0][0] # 获得列表中第一个字符串的第一个字符 '0'
# ----【 读取与替换】--------------------------------
## 创建里面为列表的列表
l = [] # 创建空列表
for i in b: # b为列表,对每个对象进行逐一操作
m = re.sub(r'\n','',i) # 完成一系列对字符串的操作,结果仍为字符串string
# p = re.split(',',m) 若需要,可对字符串进行分割,结果为列表list
l.append(m)
l
[',,,会员简称,成交量,比上一交易日增减,会员简称,持买单量,比上一交易日增减,会员简称,持卖单量,比上一交易日增减',
'20160111,IC1601 ,1,海通期货 ,1581,31,上海东证 ,1287,-17,中信期货 ,2137,-95',
'20160111,IC1601 ,2,中信期货 ,1437,-13,华泰期货 ,1124,-70,广发期货 ,1583,-194',
'20160111,IC1601 ,3,国泰君安 ,1231,-55,海通期货 ,993,-16,国泰君安 ,831,-52']
1
2
3
4
5
# 用循环读取的结果为字符串格式
l = ''
with open(filename) as file_object:
for line in file_object:
l = l + line


write - 写入

  • write 不会在文本末尾添加换行符(\n),若写入多行时,建议在最后添加换行符 \n.
    • tb1.write('I love programming.\n')

r - 只读模式
w - 只写模式。覆盖之前的同名文件(即删除里面的所有内容)。如果文件不存在就创建文件
a - 追加模式打开。附加到现有文件;若文件不存在则创建一个;添加到文件末尾
r+ - 读写模式
w+ 以读写模式打开

1
2
3
4
5
6
7
8
9
10
11
12
with open('path\filename.csv', 'w') as tb1:
tb1.write('I love programming!') # 直接在该文件中最后写入
# --------------若要写入文档,先完成数据的提取-----------------
b = '' # 空字符串;因为文本文档均为字符串格式
with open('path\filename.csv') as f:
a = f.readlines() # 此时a为列表list格式; 也可为 a = f.read(),则该处a为字符串格式
for i in range(len(a)):
b = b + str(i) + a[i]
with open('path\filename.csv') as f:
f1 = f.write(b)


##【实战演练】

【获取上一层次目录中,test文件夹内的所有文件,并选取csv格式的文档】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import os
import re
# 方法一
>>> os.listdir('../')
['.ipynb_checkpoints',
'.Rhistory',
'Python',
'R_dir',
'test',
'test.ipynb']
## 手动添加目录
>>> file_name = os.listdir('../test')
['2016-01-11-IC_1.csv',
'2016-01-11-IH_1.csv',
'2016-01-12-TF_1.csv',
'2016-01-13-T_1.csv']
## 用Re模块匹配符合的文档
>>> k = []
for i in file_name:
if re.findall(r'.*\.csv$',i):
k.append('../test/'+i)
k
['../test/2016-01-11-IC_1.csv',
'../test/2016-01-11-IH_1.csv',
'../test/2016-01-12-TF_1.csv',
'../test/2016-01-13-T_1.csv']
# -------获得绝对路径的文件名-------------------------------------------------------
dir_name = os.path.abspath('../test/')
dir_name
k = []
for i in file_name:
if re.findall(r'.*\.csv$',i):
k.append(dir_name+i)
k
['E:\\Jupyter_notebook\\test2016-01-11-IC_1.csv',
'E:\\Jupyter_notebook\\test2016-01-11-IH_1.csv',
'E:\\Jupyter_notebook\\test2016-01-12-TF_1.csv',
'E:\\Jupyter_notebook\\test2016-01-13-T_1.csv',
'E:\\Jupyter_notebook\\testtest - 副本.csv']
# ------------------------------------------------------
# 方法二
dir_name1 = os.path.abspath('../')
'E:\\Jupyter_notebook'
os.listdir('../') # 结果同上
test_dir = os.path.join(dir_name1, 'test')
os.listdir(test_dir)
['2016-01-11-IC_1.csv',
'2016-01-11-IH_1.csv',
'2016-01-12-TF_1.csv',
'2016-01-13-T_1.csv']


【获取其他目录下的文件】

1
2
3
4
5
# 获取当前工作目录
os.getcwd()
# 变更工作目录
os.chdir('E:\Others')



导入与导出 - pandas

导入数据

pandas默认将表格型数据读取为数据框格式(DataFrame)

“./” 表示当前目录

“../“ 表示上一目录

import pandas as pd
import numpy as np

df:任意的Pandas DataFrame对象
s:任意的Pandas Series对象

  • pd.read_csv(“./filename.txt”, sep=’,’, header=0, names=[‘a’,’b’], skiprows=0, index_col=’a’, na_values=’NULL’, nrows=1000, encoding=’gb2312’, thousands= ‘,’) :从CSV文件导入数据

sep =’\s+’ 正则表达式的空白字符串

header=0,表示默认第一行为列名; header=None 没有列名行

names=[‘a’, ‘b’] 用于指定列名,与header=None结合使用

skiprows=0, skiprows=[0,2,3] 表示跳过的观测行;

skip_footer=0,表示忽略的行数(从文件末尾算起)

index_col =[‘a’,’b’] 表示指定为索引列

na_valuse = [‘Null’] 一组将NA值替换为指定的字符’Null’ 或其他任意形式

nrows=1000 表示读取的行数,从文件开始处算起

thousands=’,’ / ‘.’ 千分位分隔符

1
2
tb01 = pd.read_csv("./filename.txt", sep=',', header=0, names=['a','b'], skiprows=0, index_col='a', na_values='NULL', nrows=1000, encoding='gb2312', thousands= ',') # 默认分隔符为逗号;
tb01 = pd.read_table()  #
  • pd.read_excel(filename):从Excel文件导入数据
  • pd.read_table(filename):从限定分隔符(默认为制表符 “\t”)的文本文件导入数据; 也可读csv格式的文档,但建议将sep=’,’
  • pd.read_sql(query, connection_object):从SQL表/库导入数据
  • pd.read_json(json_string):从JSON格式的字符串导入数据
  • pd.read_html(url):解析URL、字符串或者HTML文件,抽取其中的tables表格
  • pd.read_clipboard():从你的粘贴板获取内容,并传给read_table()
  • pd.DataFrame(dict):从字典对象导入数据,Key是列名,Value是数据


####数据清洗

1
2
3
4
5
6
7
8
with open('关联客户0522.csv') as tb0:
tb1 = tb0.readlines() # 将tb0中的内容按行读取为列表;(此时自动生成了一个换行符\n)
tb3 = []
for tb in tb1: # 一次访问列表list中的元素(此时各元素为字符串格式,故可以对其进行操作)
tb2 = tb.replace('"', '').replace('\n','').strip().split(',') # 依次完成各个操作 替换” - 替换\n - 去空格 - 按分隔符','将元素转化为列表
tb3.append(tb2) # 在列表tb3中添加以将各元素转为列表的值;最终类型为列表的列表
print(tb3)
tb3[1][1]


显示所有行数

pandas默认会隐去中间的部分。如果希望能显示完整,可以使用下面的方法:

  • 一次性设置Pandas运行环境,以便输出所有记录;
1
2
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
  • 针对特定输出,设置Pandas参数。运行之后,再恢复到默认值
1
2
with pd.option_context('display.max_rows', None, 'display.max_columns', 3): # None 为全部;或者指定具体的数值
print (df)

导出数据

缺失值 在输出结果中为 空字符串;

  • DataFrame.to_cvs(‘filename.csv’, sep=’,’, na_rep=’NULL’, index=False, header=False, cols=[‘a’,’b’,’c’]):导出数据到CSV文件
  • df.to_excel(filename):导出数据到Excel文件
    • DataFrame.to_excel(excel_writer, sheet_name=’Sheet1’, na_rep=’’, float_format=None, columns=None, header=True, index=True, index_label=None, startrow=0, startcol=0, engine=None, merge_cells=True, encoding=None, inf_rep=’inf’, verbose=True, freeze_panes=None)

excel_writer : string or ExcelWriter object. File path or existing ExcelWriter

na_rep : string, default ‘’ . Missing data representation

float_format : string, default None. Format string for floating point numbers

columns : sequence, optional. Columns to write ;表示需要导出的列

header : boolean or list of string, default True; 表示可以重命名列名

index : boolean, default True ;是否包含索引列

index_label : string or sequence, default None

startrow :upper left cell row to dump data frame

encoding: string, default None

  • df.to_sql(table_name, connection_object):导出数据到SQL表
  • df.to_json(filename):以Json格式导出数据到文本文件
1
2
3
4
5
6
7
8
9
10
11
12
# 导出数据
>>> dir_name
'E:\\my_computer\\1_工作学习\\10_工作文档\\5 银天下-数据分析\\30_专项分析\\0102_股今中外链接统计\\人员信息\\历史数据'
lj01.to_excel(dir_name+'\\'+'lj02.xls',index=False)
qian_all_data.to_csv('qianguqg.csv', index=False)
# 导入到同一Excel的多个sheet
>>> writer = pd.ExcelWriter('output.xlsx')
>>> df1.to_excel(writer,'Sheet1')
>>> df2.to_excel(writer,'Sheet2')
>>> writer.save()



【实战演练】

将所有CSV文档读入到同一个对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import pandas as pd
import re
# 读取csv的文件,并写入到一个列表 name2
name2 = []
l = re.compile('.*\.csv')
for i in name:
if re.findall(l, i):
name2.append(i)
# 读入到同一个对象
table1 = []
for i in name2:
# print(i)
# need_table = pd.read_csv(i)
table0 = pd.read_csv('../future-exchange/'+i, encoding = 'gb2312')
table1.append(table0)