Python 解析csv文件并拆分为子文件
我正在尝试创建一个通用过滤器,根据Yaml文件的条件拆分文件 我的代码正在运行Pandas,但由于环境中没有Pandas模块,我试图通过CSV库实现它 当我硬编码q的值时,它工作,但当我试图从配置文件传递它时,它不工作。我还想在同一列上通过多个检查,如(“”,'Balance)。因此,Python 解析csv文件并拆分为子文件,python,csv,lambda,Python,Csv,Lambda,我正在尝试创建一个通用过滤器,根据Yaml文件的条件拆分文件 我的代码正在运行Pandas,但由于环境中没有Pandas模块,我试图通过CSV库实现它 当我硬编码q的值时,它工作,但当我试图从配置文件传递它时,它不工作。我还想在同一列上通过多个检查,如(“”,'Balance)。因此,Asset转到一个文件,而('','Balance)转到另一个文件 import sys import yaml import csv def dynamicQuery(config_file, data_fi
Asset
转到一个文件,而('','Balance)
转到另一个文件
import sys
import yaml
import csv
def dynamicQuery(config_file, data_file, outputPath):
"""Loading Configuration file into dataframe"""
try:
with open(config_file) as file:
doc = yaml.full_load(file)
except Exception as err:
print("Error Configuration data file: ", err)
try:
for k, v in doc.items():
if k != 'column':
filename = k
k = doc[k]
q = ' , '.join(f'{v} ' for q, v in k.items())
q = '"' + str(strip(q)) + '"'
print(q) #-- "Asset"
df = csv.reader(open(data_file), delimiter=',')
df = filter(lambda x: (x[2] == q), df) # Not working here
#df = filter(lambda x: x[2] == "Asset", df) --> this is working
csv.writer(open(filename + ".txt", 'w', newline=' '), delimiter=',').writerows(df)
print("File is created for " + filename)
except Exception as err:
print("Error executing queries and saving output data file: ", err)
def main():
if len(sys.argv) == 3:
"""File will be passed as parameter """
config_file = sys.argv[1]
data_file = sys.argv[2]
dynamicQuery(config_file, data_file)
else:
usage()
def usage():
print("Usage: python splitGenric.py config_file data_file ")
main()
样本文件
1233,ACV,Asset,sample
1235,ACV,Asset,sample
1232,ACV,Asset,sample
1234,ACV,Asset,sample
1237,ACV,,sample
1238,ACV,,sample
1234,ACV,Balance,sample
1254,ACV,Balance,sample
1244,ACV,Balance,sample
1264,ACV,Balance,sample
Config.yaml
Asset :
filter1: '"Asset"'
Balance:
filter1: '"Balance"'
filter2: '""'
YAML配置文件格式对此并不特别方便,而且
YAML
不是标准的Python模块。我可能会选择正则表达式之类的东西,而不是YAML文件。但是,为了解决眼前的问题,这里的问题是,您混淆了Python语法和文字引用字符。您正在汇编一个字符串,该字符串包含资产
周围的双引号,例如,您的CSV文件不包含该值周围的双引号;因此,您可以有效地比较如果'Asset'=''Asset'
,这当然是False
下面的内容可能并不完全符合您的要求,但至少应该演示一下我认为您在这里要做的第一步
打开(配置文件)作为文件:
config=yaml.full_加载(文件)
过滤器=dict()
对于config.items()中的k,v:
句柄=打开(k+'.txt',w',换行符='')
writer=csv.writer(句柄,分隔符=',')
filt={'handle':句柄,'writer':writer,'conditions':[]}
对于u2;,在v.items()中表示:
filt['conditions'].append(expr.strip('“'))
过滤器[k]=过滤器
打开(数据_文件)作为csvfile时:
reader=csv.reader(csvfile)
对于读取器中的行:
对于句柄,filters.items()中的conf:
对于范围内的i(len(conf['conditions']):
如果行[2]==conf['conditions'][i]:
conf['writer'].writerow(行)
打破
对于句柄,filters.items()中的conf:
conf['handle'].close()
我猜您使用的是
pyyaml
,它似乎是Python的主要YAML模块。我试图使用config.YAML,但出现了这个错误
File "C:\Users\XXXXXX\AppData\Local\Programs\Python\Python36-32\lib\site-packages\yaml\parser.py", line 439, in parse_block_mapping_key
"expected <block end>, but found %r" % token.id, token.start_mark)
yaml.parser.ParserError: while parsing a block mapping
in "config.yml", line 5, column 5
expected <block end>, but found ','
in "config.yml", line 5, column 17
结果是两个文件,内容如下:
Asset.txt:
1233,ACV,Asset,sample
1235,ACV,Asset,sample
1232,ACV,Asset,sample
1234,ACV,Asset,sample
Balance.txt:
1234,ACV,Balance,sample
1254,ACV,Balance,sample
1244,ACV,Balance,sample
1264,ACV,Balance,sample
1237,ACV,nan,sample
1238,ACV,nan,sample
您在
q
中得到了什么?为什么您希望它等于CSV文件中的任何内容?您的数据似乎都不匹配(特别是强制文字双引号)。对于配置文件,我获取q=“Asset”,我想从该文件中匹配它。如果我硬编码“Asset”“在Lambda函数中,它只适用于一种情况,即将q=“Asset”
中的语法引号与q='“Asset”
中的文字引号混淆。但是也不清楚与和的连接应该创建什么。您仍然可以编辑以澄清此逻辑的工作方式吗?我的坏消息是,我将其更改为,
,因为我将,&
用于我的pandas代码。如果我在配置文件中为相同的列设置了多个过滤条件,我就会使用它,我会使用一个命令将它们连接在一起,该命令通过PyYAML读取YAML文件;你用了什么?OP似乎在说他们不能使用Pandas。我使用Notepad++保存了yml extesion,并尝试用空闲的Python打开。当然,但是import yaml
对您的作用可能与OP不同,我们不知道这是什么(实际上对你们两个来说)。
1234,ACV,Balance,sample
1254,ACV,Balance,sample
1244,ACV,Balance,sample
1264,ACV,Balance,sample
1237,ACV,nan,sample
1238,ACV,nan,sample