如何使用Pandas read_CSV解析云SQL CSV导出空值(";N)
使用Airflow,我们将数据从Google Cloud SQL导出到CSV,并最终将该CSV加载到另一个SQL仓库中。但是,云SQL将空值导出为字符串如何使用Pandas read_CSV解析云SQL CSV导出空值(";N),pandas,google-cloud-sql,Pandas,Google Cloud Sql,使用Airflow,我们将数据从Google Cloud SQL导出到CSV,并最终将该CSV加载到另一个SQL仓库中。但是,云SQL将空值导出为字符串“N(这是已知的Google问题:)。作为临时步骤,我们需要打开文件并删除“N。csv中也有实际字符串,通常使用“ 理想情况下,我们可以用pandas实现这一点-我们正在设置下一步使用数据帧。但是,我无法让read_csv将“N解释为空。以下是我尝试过的基本命令: df=pd.read\u csv(文件路径,na\u值='N') 我也尝试过na_
“N
(这是已知的Google问题:)。作为临时步骤,我们需要打开文件并删除“N
。csv中也有实际字符串,通常使用“
理想情况下,我们可以用pandas实现这一点-我们正在设置下一步使用数据帧。但是,我无法让read_csv将“N
解释为空。以下是我尝试过的基本命令:
df=pd.read\u csv(文件路径,na\u值='N')
我也尝试过na_values=“\“N”
,但结果相同
似乎read\u csv
首先检查字符串,然后检查空值,所以我得到的输出如下所示:
Id 100
IncidentDate 2018-08-29 07:00:00
StudentInvolved Psueudonym
IncidentLocation Classroom
IncidentCategory Academic dishonesty
IncidentDescriptionDetails [TESTING] How does this insert into table when...
FollowUp 0
ConsequenceGiven Afterschool Academy
ConsequenceStartDate N,N
ConsequenceEndDate N,N
PrimaryViolation <email address>
Weapon <school_name>
CreatedBy N,N
SiteName 1000
DisciplinaryActionAuthority N,0,N
DocumentationUrl N,N
SIS_ID N,N
SubmittedBy N,N
Deleted N,N
FollowUpNotes N,N
StudentLists_fk N,N
ID100
附带日期2018-08-29 07:00:00
学生未解决的问题
意外事故定位教室
附带类别学术欺诈
IncidentDescriptionDetails[测试]当。。。
后续0
课后学院
结果开始日期N,N
结果结束日期N,N
初犯
武器
由N,N创建
站点名称1000
纪律处分机构N,0,N
文档URL N,N
SIS_ID N,N
由N,N提交
删除N,N
后续注释N,N
学生名单
关于读取csv是否能够解析该值的任何想法?在加载到数据帧之前,您需要替换该值。一种方法是在linux中使用
sed
命令
sed's/“N/NULL/g”.csv
然后装进熊猫
自动生成导出语句:
folderName=`date +%m-%d-%Y`
fileName=`date +%H:%M:%S`
gs_path="gs://generic_test/$folderName/$fileName.csv"
gcloud sql export csv upc-asin-mapping $gs_path --query="select * from tableName;" --database=db_name
gsutil -m cp $gs_path .
sed -i "" 's/"N/NULL/g' $fileName.csv
gsutil -m cp $fileName.csv $gs_path
上面的脚本将下载该文件,将“N
替换为NULL
,然后用相同的名称重新上载相同的文件。
这不是一种可扩展的方法。在加载到数据帧之前,需要替换该值。一种方法是在linux中使用
sed
命令
sed's/“N/NULL/g”.csv
然后装进熊猫
自动生成导出语句:
folderName=`date +%m-%d-%Y`
fileName=`date +%H:%M:%S`
gs_path="gs://generic_test/$folderName/$fileName.csv"
gcloud sql export csv upc-asin-mapping $gs_path --query="select * from tableName;" --database=db_name
gsutil -m cp $gs_path .
sed -i "" 's/"N/NULL/g' $fileName.csv
gsutil -m cp $fileName.csv $gs_path
上面的脚本将下载该文件,将“N
替换为NULL
,然后用相同的名称重新上载相同的文件。
这不是一种可扩展的方法。最终不得不通过替换文本来强制它
with open(filepath, 'r', encoding="utf-8") as inputFile:
raw_text = inputFile.read()
edited_text = raw_text.replace('"N,', ',')
edited_text = edited_text.replace(',"N\n', ',\n')
with open(edited_filepath, 'w', newline='\n', encoding="utf-8") as outputFile:
outputFile.write(edited_text)
df = pd.read_csv(edited_filepath, names=incident_columns)
一个缺点是,这会弄乱任何合法以
N、
或N\N
开头的字符串,但希望我们的用户不会有这样的输入习惯。最终不得不通过替换文本来强制输入
with open(filepath, 'r', encoding="utf-8") as inputFile:
raw_text = inputFile.read()
edited_text = raw_text.replace('"N,', ',')
edited_text = edited_text.replace(',"N\n', ',\n')
with open(edited_filepath, 'w', newline='\n', encoding="utf-8") as outputFile:
outputFile.write(edited_text)
df = pd.read_csv(edited_filepath, names=incident_columns)
一个缺点是,这会弄乱任何合法以
N、
或N\N
开头的字符串,但希望我们的用户没有这样输入东西的习惯。这大致就是我们最终要做的,但在Python内部,而不是在Linux中。在Linux中,您可以选择使用gsutil
中的-m
选项进行多线程下载。我不确定python中是否存在这种情况。因此,我更喜欢bash script这大致就是我们最终要做的,但是在Python内部而不是Linux中。在Linux中,您可以选择在gsutil
中使用-m
选项进行多线程下载。我不确定python中是否存在这种情况。因此,我更喜欢bash脚本