如何在Python中刮取固定宽度的文件?

问题描述 投票:-1回答:2

在Python 3中,我有一系列带有“固定宽度文件”的链接。它们是包含公司公共信息的网站。每行都有关于公司的信息

示例链接:

http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214AC

http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214RO

我在字典中有这些链接。关键是公司所在国家/地区的名称,价值是链接

for chave, valor in dict_val.items():
    print (f'Region of country: {chave} - and link with information: {valor}')

Region of country: Acre - and link with information: http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214AC
Region of country: Espírito Santo - and link with information: http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214ES
...

我想阅读这些链接(固定宽度文件)并将内容保存为CSV文件。示例内容:

0107397388000155ASSOCIACAO CULTURAL                                                                                                                                                          
02073973880001552              16MARIA DO SOCORRO RODRIGUES ALVES BRAGA                                                                                                                      
0101904573000102ABREU E SILVA COMERCIO DE MEDICAMENTOS LTDA-ME  - ME                                                                                                                         
02019045730001022              49JETEBERSON OLIVEIRA DE ABREU                                                                                                                                
02019045730001022              49LUZINETE SANTOS DA SILVA ABREU                                                                                                                              
0101668652000161CONSELHO ESCOLAR DA ESCOLA ULISSES GUIMARAES                                                                                                                                 
02016686520001612              10REGINA CLAUDIA RAMOS DA SILVA PESSOA                                                                                                                        
0101631137000107FORTERM * REPRESENTACOES E COMERCIO LTDA                                                                                                                                     
02016311370001072              49ANTONIO MARCOS GONCALVES                                                                                                                                    
02016311370001072              22IVANEIDE BERNARDO DE MENEZES 

但是要填充CSV列的行,我需要使用“固定宽度文件”分离和测试链接的每一行

我必须遵循以下规则:

1.如果行以“01”开头,则是包含公司注册号及其名称的行。示例:"0107397388000155ASSOCIACAO CULTURAL"

1.1 - “01”表示此/

1.2 - 该行的下一个14个职位是公司代码 - 从第3位开始到16 - (07397388000155)/

1.3 - 以下150个职位是公司名称 - 从第17位开始到166结束 - (ASSOCIACAO CULTURAL)

2.如果该行以“02”开头,它将包含有关公司合作伙伴的信息。示例:"02073973880001552 16MARIA DO SOCORRO RODRIGUES ALVES BRAGA" /

2.1 - “02”表示此/

2.2 - 接下来的十四个职位是公司注册码 - 从第3位开始到第16位结束(07397388000155)/

2.3 - 下一个数字是成员标识符代码,可以是1,2或3 - 开始和结束在第17位 - (2)/

2.4 - 接下来的十四个职位是另一个识别成员的代码 - 从第18位开始到31结束 - (“” - 在这种情况下是空的)/

2.5 - 接下来的两个位置是识别成员的另一个代码 - 从第32位开始到第33(16)位结束/

2.6 - 150个最终位置是合作伙伴的名字 - 从第34位开始到183结束(MARIA DO SOCORRO RODRIGUES ALVES BRAGA)

请在这种情况下,一种可能的策略是将每个链接保存为TXT?然后尝试分开立场?或者有更好的方法来擦除固定宽度的文件?

python web-scraping fixed-width
2个回答
3
投票

您可以查看任何URL解析模块。我推荐Requests,虽然你可以使用与python捆绑在一起的urllib

考虑到这一点,您可以从页面中查看文本,并查看它不需要登录任何来自请求,它只是一个问题:

import requests
r = requests.get('Your link from receita.fazenda.gov.br')
page_text = r.text

阅读Quickstart部分请求中的更多内容。我将把“位置分离”留给你。

提示:使用正则表达式。


2
投票

使用scrapy可以将链接中的内容作为流读取并处理它而不保存到文件。 scrapy的文档是here

这里还有一个相关的问题:How do you open a file stream for reading using Scrapy?

© www.soinside.com 2019 - 2024. All rights reserved.