[英]How to handle lists as single values in csv with Python
我正在處理csv導入,遇到麻煩,該值應為列表形式,但應讀取為字符串。
csv行之一如下所示:
['name1', "['name2', 'name3']"]
如您所見,第二列中的值是一個列表,但被讀取為字符串。 我的問題是我需要遍歷該列表,並且該列表的長度可能因行而異。
我想知道問題出在哪里。 csv可以讀取不處理列表嗎? 有沒有辦法將第二列中的字符串轉換為列表,而不是使用正則表達式? 這是我正在運行的代碼:
import csv
import os
content = []
file_path = os.path.abspath(file)
if os.path.exists(file_path):
with open(file_path, 'rb') as csvfile:
csvreader = csv.reader(csvfile, delimiter = ',')
for row in csvreader:
content.append(row)
for row in content[1:5]:
print row
print row[0], row[1]
for name in row[1]:
print name
輸出行的外觀如上,但是在遍歷row [1]時,它不會遍歷名稱列表,而是遍歷每個字符。 有人知道嗎? 在此先感謝您的幫助!
將字符串轉換為列表的簡單方法是使用ast.literal_eval
函數。
范例-
>>> import ast
>>> s = "['name2', 'name3']"
>>> s
"['name2', 'name3']"
>>> l = ast.literal_eval(s)
>>> l
['name2', 'name3']
>>> type(l)
<class 'list'>
從AST 文檔 -
ast.literal_eval(node_or_string)
安全地評估包含Python文字或容器顯示的表達式節點或Unicode或Latin-1編碼的字符串。 提供的字符串或節點只能由以下Python文字結構組成:字符串,數字,元組,列表,字典,布爾值和無。
但是,如果完整的csv看起來像這樣,則應考慮使用json
解析csv,而不是csv
模塊。
考慮到您的第二個列表項是有效的python數據類型,可以使用ast.literal_eval
來解析字符串
>>> import ast
>>> ast.literal_eval("['name2', 'name3']")
['name2', 'name3']
因此,在您的特定情況下,您可能需要執行以下操作
.............
row[1] = ast.literal_eval(row[1])
print row[0], row[1]
for name in row[1]:
print name
試試看,使用literal_eval
將字符串轉換為相應的class
from ast import literal_eval
for name in literal_eval(row[1]):
print name
要么
for name in eval(row[1]):
print name
x=['name1', "['name2', 'name3']"]
import re
print [ast.literal_eval(i) if re.match(r"\[.*?\]",i) else i for i in x ]
輸出: ['name1', ['name2', 'name3']]
您可以使用ast.literal_eval
並re
將list中的字符串轉換為list並保留其他字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.