Python爬虫——csv数据存取/数据处理

1. Python内置csv模块

常用模式 含义
r 只读
r+

读写

rb 二进制 读
rb+ 二进制 读写
w 只写
w+ 读写
wb 二进制 写
wb+ 二进制 读写
a 追加
a+ 读写
ab 二进制 读
ab+ 二进制 读写

注意:1. 使用“w”模式。文件若存在,会覆盖原文件;文件若不存在,会创建新文件。

           2. 使用“a”模式。默认把要写入的数据追加到文件末尾;如果文件不存在,将自动创建。

eg1. with open 方法

import csv

with  open('test.csv','w') as csvFile:
    writer = csv.writer(csvFile)
    #先写columns_name
    writer.writerow(["index","a_name","b_name"])
    #写入多行用writerows
    writer.writerows([[1,2,3],[0,1,2],[4,5,6]])
 
#用reder读取csv文件
with open('test.csv','w') as csvFile:
    reader = csv.reader(csvFile)
    for line in reader:    # 通过迭代器访问文件
        print(line)

eg2. open 方法

import csv

# 创建/打开一个csv文件
f = open('小说.csv', 'w', encoding='utf-8-sig', newline='')
# 基于文件对象构建csv写入对象
csv_write = csv.writer(f)
# 构建csv列表头
csv_write.writerow(["title", "score", "evaluator", "href"])
for i  in csv_write:
    print(i)
f1.close()

注意:使用open 方式时,调用write()来写入文件,但是务必要调用f.close()来关闭文件。因为写入文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。因此,只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()可能导致数据只写了一部分到磁盘,剩下的丢失了,还会占用操作系统的资源。而使用with语句来写入时会自动调用close()方法

2. Python第三方库:pandas库

import pandas as pd

data = pd.read_csv(r'', header=0)  # 读取文件



data['ReferenceNum'] = pd.DataFrame(data=NumReference)  # 存入CSV表单
data['ForeignNum'] = pd.DataFrame(data=ForeignNum)
data.to_csv('', encoding='utf-8-sig', index=False)

3. pandas库之多文件数据处理

     3.1 合并多个文件

  • 方法一:pandas提供的concat函数
####### 行合并 #######
f1 = pd.read_csv('file1.csv')
f2 = pd.read_csv('file2.csv')
file = [f1,f2]
train = pd.concat(file)
train.to_csv("file3" + ".csv", index=0, sep=',')

####### 列合并 #######
f1 = pd.read_csv('file1.csv')
f2 = pd.read_csv('file2.csv')
file = [f1,f2]
train = pd.concat(file,axis=1)    # 设置axis=1即可实现
train.to_csv("file3" + ".csv", index=0, sep=',')
  • 方法二:利用内置csv模块,循环读写
import pandas as pd
import glob
import os

csv_list = glob.glob('*.csv') #查看同文件夹下的csv文件数
print(u'共发现%s个CSV文件'% len(csv_list))
#循环读取同文件夹下的csv文件
for i in csv_list:
    fr = open(i,'rb').read()
    with open('result.csv','ab') as f: #将结果保存为result.csv
        f.write(fr)
print('合并完毕!')

     3.2 数据处理——滤空、去重、填充

        首先引入模块pandas库,读取csv文件,再根据需求进行下一步操作。

import pandas as pd

df = pd.read_csv("result.csv",header=0)

数据预处理:检测缺失值

# 检查列是否有缺失值,false无缺失值||true有缺失值;对于行any(axis=1)
print(df.isnull().any())

# 统计缺失值的数量;对于某一列:print(df.age.isnull().sum())
# print(df.isnull().sum())


# 替换缺失值:用NA替换数据中的X
m, n = df.shape #数据维度;i,j根据数据定义
for i in range(0, m):
    for j in n:
        if df.loc[i, j] == 'X':
            df.loc[i, j] = 'NaN'

        3.2.1 dropna()方法:过滤任何含有缺失值的行

df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
参数 含义
axis

axis=0 : 删除包含缺失值的行

axis=1 : 删除包含缺失值的列

how

与axis配合使用

how=‘any’ :只要有缺失值出现,就删除该行或列

how=‘all’ :所有的值都缺失,才删除行或列

thresh

axis中至少有thresh个非缺失值,否则删除

eg. axis=0,thresh=10:标识如果该行中非缺失值的数量小于10,将删除该行

subset

list,在哪些列中查看是否存在缺失值

eg. subset=['list']

inplace

是否在原数据上操作

True:返回None;

False:返回新的copy,去掉了缺失值

        3.2.2 drop_duplicates函数的使用:去除重复的内容

df.drop_duplicates(subset=None, keep='first', inplace=False, ignore_index= False)
参数 含义
subset

用来指定特定的列,默认为None

subset=None:所有标签都相同才认为是重复项

keep

{‘first’, ‘last’, False},默认 ‘first’

‘first’:保留该标签第一次出现时的样本,之后重复出现的全部丢弃。
‘last’:表示保留该标签最后一次出现的样本,
False:该标签重复的样本全部丢弃

inplace

Boolean,默认为False

False:返回去除重复项后的DataFrame,原来的DataFrame不改变。
True:返回空值,原来DataFrame被改变

ignore_index

Boolean,默认为False

False:丢弃重复值之后的DataFrame的index不改变
True:丢弃重复值之后的DataFrame的index重新变为0, 1, …, n-1

        3.2.3 fillna()方法:填充缺失值

DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
参数 含义
value

scalar, dict, Series, or DataFrame

dict 可以指定每一行或列用什么值填充

method

{‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, 默认为 None(在列上操作)

ffill / pad: 使用前一个值来填充缺失值

backfill / bfill :使用后一个值来填充缺失值

None:指定一个值去替换缺失值(缺省默认这种方式)

axis

修改填充方向,默认纵向

如要修改方向变为横向填充(行)设置 axis=1

inplace

Boolean,默认为False

True:直接修改原对象

False:创建一个副本,修改副本,原对象不变(缺省默认)

limit 填充的缺失值个数限制

4. object类型数据处理

4.1 object \rightarrow  str、float等所需类型

# 将dataframe某一列数据类型为object的转换为数字类型float
df["val"] = pd.to_numeric(df["val"],errors='coerce')


df = df.convert_objects(convert_numeric=True)

traindata=pd.DataFrame(traindata,dtype=np.float)
DataFrame.info()

# object —— str
df['val'] = df['val'].astype(str)

4.2 object \rightarrowdatetime日期类型

  • pandas中to_datetime()函数
    pandas.to_datetime(arg,format=None,unit=None)
    参数 含义
    arg 需要转换类型的数据list
    format

    所输入数据的时间格式

    月 日 年  时 分 秒 :'%m/%d/%Y %H:%M:%S'

    星期 月 日  时 分 秒 年:"%a %b %d %H:%M:%S %Y"

    unit 最小时间间隔,如’D’代表一天

    反之,datetime \rightarrowobject:map函数中的strftime()

df_object=df_time.map(lambda x:x.strftime('%Y/%m/%d'))

参考文献:

  1. 如何把python中的DataFrame中的object对象转换成我们需要的类型?_A18312800683的博客-CSDN博客
  2. Pandas-object字符类型转时间类型to_datetime()函数_MsSpark的博客-CSDN博客

你可能感兴趣的:(python,爬虫,python,爬虫,csv)