簡體   English   中英

如何使用Python在csv中將列表作為單個值處理

[英]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_evalre將list中的字符串轉換為list並保留其他字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM