Python和生成器以CSV格式处理行

Python和生成器以CSV格式处理行,python,pandas,generator,Python,Pandas,Generator,希望这是一个允许的问题,但我希望得到一些建议,如何将下面处理文件中的行以生成数据帧的代码转换为使用生成器并生成数据帧的代码,因为使用list和append的实现太慢了 这是我提出的解决方案,但我真的希望避免使用非常慢的列表和追加操作。我希望能找到一个更酷的发电机和产量解决方案,但在使用发电机时还不够舒服 文件中的示例行: "USNC3255","27","US","NC","LANDS END","72305006","KNJM","KNCA","KNKT","T72305006","","

希望这是一个允许的问题,但我希望得到一些建议,如何将下面处理文件中的行以生成数据帧的代码转换为使用生成器并生成数据帧的代码,因为使用list和append的实现太慢了

这是我提出的解决方案,但我真的希望避免使用非常慢的列表和追加操作。我希望能找到一个更酷的发电机和产量解决方案,但在使用发电机时还不够舒服

文件中的示例行:

"USNC3255","27","US","NC","LANDS   END","72305006","KNJM","KNCA","KNKT","T72305006","","","NCC031","NCZ095","","545","28594","America/New_York","34.65266","-77.07661","7","RDU","893727","
"USNC3256","27","US","NC","LANDSDOWN","72314058","KEHO","KAKH","KIPJ","T72314058","","","NCC045","NCZ068","sc007","517","28150","America/New_York","35.29374","-81.46537","797","CLT","317845","
当前解决方案:

def parse_file(filename):

    newline = []

    with open(filename, 'rb') as f:
        reader = csv.reader(f, quoting=csv.QUOTE_NONE)
        for row in reader:
            newline.append([s.strip('"') for s in row[:-1]])
    df = pd.DataFrame(newline)
    df = df.applymap(lambda x: nan if len(x) == 0 else x).astype(object)
    return df

df = parse_file(filename)

如果针对上面的示例行使用,则输出只是一个包含23列和两行的数据帧

文件中唯一的问题是每行都以
,“
结尾。这会混淆解析器。如果可以删除尾随的逗号和引号,则可以使用常规解析器

import pandas as pd
from StringIO import StringIO
with open('example.txt') as myfile:
    data = myfile.read().replace(',"\n', '\n')
pd.read_csv(StringIO(data), header=None)
这就是我得到的:

         0   1   2   3            4         5     6     7     8          9   \
0  USNC3255  27  US  NC  LANDS   END  72305006  KNJM  KNCA  KNKT  T72305006   
1  USNC3256  27  US  NC    LANDSDOWN  72314058  KEHO  KAKH  KIPJ  T72314058   

     ...          13     14   15     16                17        18        19  \
0    ...      NCZ095    NaN  545  28594  America/New_York  34.65266 -77.07661   
1    ...      NCZ068  sc007  517  28150  America/New_York  35.29374 -81.46537   

    20   21      22  
0    7  RDU  893727  
1  797  CLT  317845  

[2 rows x 23 columns]

您的文件唯一的问题是每一行都以
,“
结尾。这会混淆解析器。如果可以删除后面的逗号和引号,则可以使用常规解析器

import pandas as pd
from StringIO import StringIO
with open('example.txt') as myfile:
    data = myfile.read().replace(',"\n', '\n')
pd.read_csv(StringIO(data), header=None)
这就是我得到的:

         0   1   2   3            4         5     6     7     8          9   \
0  USNC3255  27  US  NC  LANDS   END  72305006  KNJM  KNCA  KNKT  T72305006   
1  USNC3256  27  US  NC    LANDSDOWN  72314058  KEHO  KAKH  KIPJ  T72314058   

     ...          13     14   15     16                17        18        19  \
0    ...      NCZ095    NaN  545  28594  America/New_York  34.65266 -77.07661   
1    ...      NCZ068  sc007  517  28150  America/New_York  35.29374 -81.46537   

    20   21      22  
0    7  RDU  893727  
1  797  CLT  317845  

[2 rows x 23 columns]

文件中唯一的问题是每行都以“”结尾。这会混淆解析器。如果可以删除尾随的逗号和引号,则可以使用常规解析器

import pandas as pd
from StringIO import StringIO
with open('example.txt') as myfile:
    data = myfile.read().replace(',"\n', '\n')
pd.read_csv(StringIO(data), header=None)
这就是我得到的:

         0   1   2   3            4         5     6     7     8          9   \
0  USNC3255  27  US  NC  LANDS   END  72305006  KNJM  KNCA  KNKT  T72305006   
1  USNC3256  27  US  NC    LANDSDOWN  72314058  KEHO  KAKH  KIPJ  T72314058   

     ...          13     14   15     16                17        18        19  \
0    ...      NCZ095    NaN  545  28594  America/New_York  34.65266 -77.07661   
1    ...      NCZ068  sc007  517  28150  America/New_York  35.29374 -81.46537   

    20   21      22  
0    7  RDU  893727  
1  797  CLT  317845  

[2 rows x 23 columns]

您的文件唯一的问题是每一行都以
,“
结尾。这会混淆解析器。如果可以删除后面的逗号和引号,则可以使用常规解析器

import pandas as pd
from StringIO import StringIO
with open('example.txt') as myfile:
    data = myfile.read().replace(',"\n', '\n')
pd.read_csv(StringIO(data), header=None)
这就是我得到的:

         0   1   2   3            4         5     6     7     8          9   \
0  USNC3255  27  US  NC  LANDS   END  72305006  KNJM  KNCA  KNKT  T72305006   
1  USNC3256  27  US  NC    LANDSDOWN  72314058  KEHO  KAKH  KIPJ  T72314058   

     ...          13     14   15     16                17        18        19  \
0    ...      NCZ095    NaN  545  28594  America/New_York  34.65266 -77.07661   
1    ...      NCZ068  sc007  517  28150  America/New_York  35.29374 -81.46537   

    20   21      22  
0    7  RDU  893727  
1  797  CLT  317845  

[2 rows x 23 columns]

谢谢,但很遗憾,清理原始文件不是一个选项。@prometheus2305为什么不呢?我没有更改原始文件的内容;它们在磁盘上是相同的。我只更改了程序内存中的内容。对不起,我误解了。这很有效,我觉得自己像个白痴。非常感谢。谢谢,但很遗憾,清理原始文件不是一个选项。@prometheus2305为什么不呢?我没有更改原始文件的内容;它们在磁盘上是相同的。我只更改了程序内存中的内容。对不起,我误解了。这很有效,我觉得自己像个白痴。非常感谢。谢谢,但很遗憾,清理原始文件不是一个选项。@prometheus2305为什么不呢?我没有更改原始文件的内容;它们在磁盘上是相同的。我只更改了程序内存中的内容。对不起,我误解了。这很有效,我觉得自己像个白痴。非常感谢。谢谢,但很遗憾,清理原始文件不是一个选项。@prometheus2305为什么不呢?我没有更改原始文件的内容;它们在磁盘上是相同的。我只更改了程序内存中的内容。对不起,我误解了。这很有效,我觉得自己像个白痴。非常感谢。