如何处理:在命令行或文件中指定的 csv 对象

问题描述 投票:0回答:1

我想接受命令行上提供的或从文件中读取的 2d 点。命令行位置参数输入示例:

(   4,-1),(0,  0)                   , (3,3)

示例 CSV 文件

4, -1
                     0,0

3             ,3

即“大括号外的逗号”和“换行符”是两种可能的分隔符。我可以看到前面有 3 条路:

  • re(如果提供的点数未知,不确定是否可能)
  • 来自Python传奇“电池”的一些魔力(模块
    csv
    对于这样一个简单的用例来说似乎有点过度设计,是真的吗?)
  • C
    方式 - 将字符串送入状态机
  • 两种格式完全分开处理
  • 去掉空格,也许是' '(见评论)。

这主要是一个概念性问题,因此任何“这是一个愚蠢的问题”或“这是一个 AB 问题”的批评比代码更受欢迎。

python csv
1个回答
0
投票

使用正则表达式可能是最简单的。

你首先需要加强语法的定义。大括号中的对只允许在标准输入中吗?可以混合吗?

这里是括号对的方法:

import re 

command_line="(   4,-1),(0,  0)                   , (3,3)"

int_pairs1=[]
for pp in re.split(r'(?<=\))[ \t]*,[ \t]*(?=\()', command_line):
    if ',' in pp:
        int_pairs1.append(list(
            map(int, re.sub(r'\(\s*|\s*\)', "", pp).split(',',1) ) ) )

另一个文件示例:

file_in='''\
4, -1
                     0,0

3             ,3
'''

int_pairs2=[]
for  pp in (l.strip() for l in file_in.splitlines()):
    if pp.strip() and ',' in pp:
        int_pairs2.append(list(map(int, pp.split(',',1) ) ) )

它们用各自的输入产生相同的输出:

>>> int_pairs1==int_pairs2
True

尝试将组成部分转换为 int 会引发异常。

© www.soinside.com 2019 - 2024. All rights reserved.