使用Python中的分隔符分隔列表

时间:2017-09-13 15:22:26

标签: python csv azure azure-sql-database azure-storage

更新(对不起,这是我的第一个问题)

我是一名实习生,对编码非常陌生 在我的工作中,我必须从Azure存储中读取文件,然后将此数据插入数据库中 为此,我使用get_file_to_text().content并将其值存储在变量file中,如下所示:

file = file_service.get_file_to_text('teste','','Retorno.csv').content

然后,我正在使用.splitlines()这样:

formFile.append(file.splitlines())

我期待这样的结果(我的文件的每一行都是子列表):

[['2017-08-01', 'Zabbix server Sura', 'system.cpu.load[percpu,avg5]', '0.2900', '0.05217361111111111111', '0.1'], ['2017-08-01', 'Zabbix server Sura', 'system.cpu.util[,iowait]' ... ]

但是我已经得到了这个(里面有所有行的一个大的子列表):

[['2017-08-01;Zabbix server Sura;system.cpu.load[percpu,avg5];0.2900;0.05217361111111111111;0.1', '2017-08-01;Zabbix server Sura;system.cpu.util[,iowait]; ... ']]

我还尝试过.split(';')

file2 = file.split(';')

但它只返回一个包含值的列表:

['2017-08-01', 'Zabbix server Sura', 'system.cpu.load[percpu,avg5]', '0.2900', '0.05217361111111111111', '0.1\n2017-08-01', 'Zabbix server Sura', 'system.cpu.util[,iowait]', ...]

我能做些什么来达到我期望的结果?

谢谢!

更新(决议):
我这样做了它工作得很好。

data = []
azurestorage_text = file_service.get_file_to_text('teste', '', 
'Retorno.csv').content
with StringIO(azurestorage_text) as file_obj:
    reader = csv.reader(file_obj, delimiter=';')
    header = next(reader)
    for line in reader:
        data.append(line)

1 个答案:

答案 0 :(得分:1)

.splitlines()将拆分文本输入中的行,返回整行列表。为了将其解析为字段(分号之间的位),您需要.split(';')每一行,例如

lines = text.splitlines()
rows = []
for line in lines:
    row.append(line.split(';'))

但是,如果要分割这样的分号分隔文本,则应使用csv.reader来解析数据。它在处理CSV格式时更加强大,包括例如“引用文本”。如果数据中的任何字段中包含分号,则拆分分号将会中断,例如“引号中的分号;文字”。

csv.reader需要一个类似文件的对象来操作,而不是字符串。要传入字符串,您可以使用StringIO为其创建类似文件的界面:

对于Python2:

from StringIO import cStringIO as StringIO
import csv

text = file_service.get_file_to_text('teste','','Retorno.csv').content
file_obj = StringIO(text)
reader = csv.reader(file_obj, delimiter=';')

for row in reader:
    print(row)

对于Python3:

from io import StringIO
import csv

file_obj = StringIO(text)


text = file_service.get_file_to_text('teste','','Retorno.csv').content
file_obj = StringIO(text)
reader = csv.reader(file_obj, delimiter=';')

for row in reader:
    print(row)

每个row都会包含您文件中的一行,并分成分号上的字段(由delimiter指定)。