【问题标题】:How to limit for each loop to read multiple string with quotation as a single string in python?python - 如何限制每个循环读取多个带引号的字符串作为python中的单个字符串?
【发布时间】:2019-05-12 04:15:51
【问题描述】:

CSV 文件包含以下数据,

"1111"","2222"2222","3333, 33, 33","444",""

csv 阅读器将这些数据读取为,

['"1111""', '"2222"2222"', '"3333', '33', '33"', '"444"', '""']

当我尝试将此阅读器对象转换为列表并尝试使用每个循环对其进行迭代时,循环将“3333、33、33”视为三个不同的值。我的要求是将其作为单个字符串读取。

代码:

reader = csv.reader(csv_file, delimiter=',',  quotechar="'", escapechar = "'")
       for row in reader:
           colValues = list(row)
           print(colValues)
           for each in colValues:
               print(each)

当前输出:

"1111""
"2222"2222"
"3333
 33
 33"
"444"
""

所需的输出:

"1111""
"2222"2222"
"3333, 33, 33"
"444"
""

【问题讨论】:

  • 文件看起来quotechar应该是双引号。
  • quotechar 应该是@schwobaseggl 建议的双引号,但即使这样也不能解决问题,因为文件格式不正确。 "1111""2222"2222 内部存在未转义的双引号的问题。这个文件来自哪里?
  • 引号(数量)重要吗?否则你可以做df = pd.read_csv(csv_file, sep='","', header=None, engine='python')。这将为您提供输出:"1111"; 2222"2222 ; 3333, 33, 33; 444; "(';' 在此示例中是值的分隔符)
  • @buran - 我们从第三方获取此文件,因此我们对此没有任何控制权。它也可能在字符串值中包含双引号。我正在创建一个实用程序来以正确的格式修复它。
  • 如果你只是用string.split(",\"")拆分它然后做一个列表理解[i if i.startswith("\"") else "\""+i for i in result]会更容易吗?

标签: python list csv foreach reader


【解决方案1】:

我认为csv 模块无法处理这种不规则格式。

您可以根据"," 进行拆分,这将为您提供正确的列。您还需要去掉第一个和最后一个引号。

>>> row = '"1111"","2222"2222","3333, 33, 33","444",""'
>>> row = row[1:-1]
>>> print(row)
1111"","2222"2222","3333, 33, 33","444","

>>> row.split('","')
['1111"', '2222"2222', '3333, 33, 33', '444', '']

总共:

with open(csv_file) as lines:
    for line in lines:
        line = line.rstrip()  # need to get rid of newline
        for element in line[1:-1].split('","'):
            print(element)

输出:

1111"
2222"2222
3333, 33, 33
444

【讨论】:

  • 谢谢@peter。这有很大帮助。还有一个问题,假设我想在输出文件的输入下面写,我们怎么写?输入文件 : ['ASSSS', '2222ASS', 'AS, 33, 33', '444', ''] 输出文件 : "ASSSS", "2222ASS", "AS, 33, 33", "444", ""]
  • 提出后续问题的问题是我是收到通知的主要人,因此您正在利用一大批专家(老我)。看看你能不能解决它,如果你在寻找特定的解决方案时遇到困难,如果需要,可以提出一个新问题。
【解决方案2】:

没有csv 库的解决方法,给定输入字符串:

input = '"1111"","2222"2222","3333, 33, 33","444",""'

这是返回所需的输出:

res = input.split(",\"")
for i, e in enumerate(res):
  if len(e) > 1 and e[0] != '"' or len(e) == 1:
    res[i] = '"' + e


for e in res:
  print (e)

# "1111""
# "2222"2222"
# "3333, 33, 33"
# "444"
# ""

但我不知道它是否适用于文件的所有行。

【讨论】:

    猜你喜欢
    • 2021-05-25
    • 1970-01-01
    • 2012-11-12
    • 2012-01-05
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    相关资源
    最近更新 更多