第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

python:CSV文件中的列表元素

python:CSV文件中的列表元素

慕娘9325324 2022-07-12 14:50:17
我有一個(gè)csv這樣結(jié)構(gòu)的文件:Id,Country,Cities1,Canada,"['Toronto','Ottawa','Montreal']"2,Italy,"['Rome','Milan','Naples', 'Palermo']"3,France,"['Paris','Cannes','Lyon']"4,Spain,"['Seville','Alicante','Barcelona']"最后一列包含一個(gè)列表,但它被表示為一個(gè)字符串,因此它被視為單個(gè)元素。解析文件時(shí),我需要將此元素作為一個(gè)list,而不是一個(gè)字符串。到目前為止,我已經(jīng)找到了轉(zhuǎn)換它的方法:L = "['Toronto','Ottawa','Montreal']"seq = ast.literal_eval(L)由于我是 的新手python,我的問題是 - 這是這樣做的正常方式,還是有一種正確的方式來表示 CSV 中的列表,這樣我就不必進(jìn)行轉(zhuǎn)換,或者有更簡(jiǎn)單的轉(zhuǎn)換方式?謝謝!
查看完整描述

3 回答

?
烙印99

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個(gè)贊

使用ast.literal_eval(...)會(huì)起作用,但它需要其他 CSV 讀取軟件無法識(shí)別的特殊語(yǔ)法,并使用一個(gè)eval危險(xiǎn)信號(hào)。


使用 eval 可能很危險(xiǎn),即使在這種情況下您使用的literal_eval是比原始eval函數(shù)更受限制的更安全的選項(xiàng)。


通常,您會(huì)在單列中有多個(gè)值的 CSV 文件中看到它們將使用簡(jiǎn)單的分隔符并引用該字段。


例如:


ID,Country,Cities

1,Canada,"Toronto;Ottawa;Montreal"

然后在 python 或任何其他語(yǔ)言中,無需求助于閱讀就變得微不足道eval:


import csv


with open("data.csv") as fobj:

    reader = csv.reader(fobj)

    field_names = next(reader)


    rows = []

    for row in reader:

        row[-1] = row[-1].split(";")

        rows.append(row)

問題ast.literal_eval

盡管該ast.literal_eval功能比在用戶輸入上使用常規(guī)功能要安全得多eval,但它仍然可能是可利用的。的文檔literal_eval有這個(gè)警告:


警告:由于 Python 的 AST 編譯器中的堆棧深度限制,使用足夠大/復(fù)雜的字符串可能會(huì)使 Python 解釋器崩潰。


可以在這里找到一個(gè)演示:


>>> import ast

>>> ast.literal_eval("()" * 10 ** 6)

[1]    48513 segmentation fault  python

我絕對(duì)不是專家,但讓用戶能夠使程序崩潰并可能利用一些模糊的內(nèi)存漏洞是不好的,在這種用例中可以避免。


如果您要使用的原因literal_eval是為了獲得正確的輸入,并且您肯定輸入數(shù)據(jù)是 100% 受信任的,那么我想它可以使用。但是,您始終可以包裝該函數(shù)以執(zhí)行一些健全性檢查:


def sanely_eval(value: str, max_size: int = 100_000) -> object:

    if len(value) > max_size:

        raise ValueError(f"len(value) is greater than the max_size={max_size!r}")

    return ast.literal_eval(value)

但是,根據(jù)您創(chuàng)建和使用 CSV 文件的方式,這可能會(huì)降低數(shù)據(jù)的可移植性,因?yàn)樗且环N特定于 python 的格式。


查看完整回答
反對(duì) 回復(fù) 2022-07-12
?
DIEA

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超3個(gè)贊

如果您可以控制 CSV,則可以將項(xiàng)目與其他一些不會(huì)出現(xiàn)在城市中且不是逗號(hào)的已知字符分開。說冒號(hào) ( :)。

例如,第一行將如下所示:

1,Canada,Toronto:Ottawa:Montreal

在處理數(shù)據(jù)時(shí),您將擁有整個(gè)元素,您可以這樣做

cities.split(':')

如果你想走另一條路(你有一個(gè) Python 列表中的城市,并且你想創(chuàng)建這個(gè)字符串)你可以使用join()

':'.join(['Toronto', 'Ottawa', 'Montreal'])


查看完整回答
反對(duì) 回復(fù) 2022-07-12
?
慕哥6287543

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個(gè)贊

對(duì)于 csv 的特定結(jié)構(gòu),您可以將城市轉(zhuǎn)換為這樣的列表:


cities = '''"['Rome','Milan','Naples', 'Palermo']"'''


cities = cities[2:-2]  # remove "[ and ]"


print(cities)  # 'Rome','Milan','Naples', 'Palermo'


cities = cities.split(',')  # convert to list


print(cities)  # ["'Rome'", "'Milan'", "'Naples'", " 'Palermo'"]


cities = [x.strip() for x in cities]  # remove leading or following spaces (if exists)


print(cities)  # ["'Rome'", "'Milan'", "'Naples'", "'Palermo'"]


cities = [x[1:-1] for x in cities]  # remove quotes '' from each city


print(cities)  # ['Rome', 'Milan', 'Naples', 'Palermo']


查看完整回答
反對(duì) 回復(fù) 2022-07-12
  • 3 回答
  • 0 關(guān)注
  • 198 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)