文章目录
- 前言
- 代码简介
- 配置相关环境
- 连接MongoDB
- 数据准备
- pandas处理数据
- 转为字典列表
- 导入数据库
- Python完整代码
前言
本篇文章简单介绍使用Python将文本数据导入MongoDB。
流程简示:
代码简介
配置相关环境
Python3.6.8
pip install pymongo
安装pymongo包
pip install pandas
安装pandas包
pip install re
安装re包
正则表达式处理字符串,自定义命名集合名,可忽略该安装包。
连接MongoDB
host = *** #ip
port = 27017 #默认端口
dbName = *** #数据库名
user = root #用户名
password = *** #密码
MClient = MC(host=host, port=port) #连接MongoDB
db = MClient[dbName] #指定数据库,等同于 use dbName
# db.authenticate(user,password) #用户验证,无 用户密码可忽略此操作
数据准备
#需要导入MongoDB的文件名
fileName = "filename.txt"
#文件所在路径
filePath = r'D:\data\\' + fileName
#集合命名
collection = re.sub('.txt', '', fileName)
#列名(字段名)
columns = ["key1", "key2", "key3"]
filePath = r'D:\data\\' + fileName
:拼接字符串,即拼接处完成路径地址;re.sub('.txt', '', fileName)
正则表达式去除后缀.txt
,可直接给集合命名(collection=collectionName
),省略此操作;columns = []
列名列表,即对应的字段名。
pandas处理数据
#展示所有列数据
pd.set_option('display.max_columns', None)
#pandas读取文件数据
data_txt = pd.read_table(filePath,header=None, names=columns, sep='\!\^', usercols = [i for i in range(start,end)], engine="python", encoding="utf-8")
#转化为dataframe(二维)
data_txt_df = pd.DataFrame(data_txt)
print(data_txt_df)
pd.set_option('display.max_columns', None)
pandas展示数据时,当列数过多时,会隐藏中间部分列,此操作可全部展示。
pd.read_table()
参数介绍:filepath
:文件路径;header=None
: 默认会自动推断数据文件列名,如果设置为None则无文件列名,为1则第一行是文件列名;names=columns
:设置列名;sep='\!\^'
:设置拆分符;usercols=[i for i in range(start,end)]
:设置需要从文件读出的列,默认全部读出;engine="python"
:默认是c引擎解析,如果使用python引擎,可以解析更丰富的内容,当数据较多时,c引擎解析速度比python快很多;encoding="utf-8"
:设置解码格式,防止中文乱码。
注解:
usercols=[i for i in range(start,end)]: 列表生成式,假设start=1,end=5,结果等同于[1,2,3,4] (迭代)。
也可替换为不连续列表,如:usercols=[2,5,6]
转为字典列表
#转化为字典列表
data_list = []
for i, row in data_txt_df:
d = {key:row[key] for key in columns}
data_list.append(d)
i
:行号,此处未用。row
:可理解为键值列表,row[key] 表示取值。{key:row[key] for key in columns}
:字典生成式,同上述列表生成式。
导入数据库
# 导入数据前清空之前数据(全量导入)
db[collection].drop()
# 数据导入
db[collection].insert_many(data_list)
db[collection].
后跟任意MongoDB操作。
Python完整代码
from pymongo import MongoClient as MC
import pandas as pd
import re
host = *** #ip
port = 27017 #默认端口
dbName = *** #数据库名
user = root #用户名
password = *** #密码
MClient = MC(host=host, port=port) #连接MongoDB
db = MClient[dbName] #指定数据库,等同于 use dbName
# db.authenticate(user,password) #用户验证,无用户密码可忽略此操作
#需要导入MongoDB的文件名
fileName = "filename.txt"
#文件所在路径
filePath = r'D:\data\\' + fileName
#集合命名
collection = re.sub('.txt', '', fileName)
#列名(字段名)
columns = ["key1", "key2", "key3"]
#展示所有列数据
pd.set_option('display.max_columns', None)
#pandas读取文件数据
data_txt = pd.read_table(filePath,header=None, names=columns, sep='\!\^', usercols = [i for i in range(start,end)], engine="python", encoding="utf-8")
#转化为dataframe(二维)
data_txt_df = pd.DataFrame(data_txt)
print(data_txt_df)
#转化为字典列表
data_list = []
for i, row in data_txt_df:
d = {key:row[key] for key in columns}
data_list.append(d)
# 导入数据前清空之前数据(全量导入)
db[collection].drop()
# 数据导入
db[collection].insert_many(data_list)