Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 解析csv文件并拆分为子文件_Python_Csv_Lambda - Fatal编程技术网

Python 解析csv文件并拆分为子文件

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

我正在尝试创建一个通用过滤器,根据Yaml文件的条件拆分文件

我的代码正在运行Pandas,但由于环境中没有Pandas模块,我试图通过CSV库实现它

当我硬编码q的值时,它工作,但当我试图从配置文件传递它时,它不工作。我还想在同一列上通过多个检查,如(“”,'Balance)。因此,
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