推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
huyinjie
V2EX  ›  Python

请教一个 Python 中字段切割问题

  •  
  •   huyinjie · Feb 11, 2020 · 4950 views
    This topic created in 2461 days ago, the information mentioned may be changed or developed.

    想要将如下这个字段按照逗号分离,但是在某些字符串中带有逗号,希望能不要分离字符串中的逗号

    6898,"RAAF Williams, Laverton Base","Laverton","Australia",\N,"YLVT",-37.86360168457031,144.74600219726562,18,10,"O","Australia/Hobart","airport","OurAirports"

    希望能分离成如下形式

    6898

    RAAF Williams, Laverton Base

    Laverton

    Australia

    直接使用 Python 中的 split 方法会将"RAAF Williams"与"Laverton Base"分离开,请问有什么办法可以避免

    27 replies  •  2020-02-14 13:19:16 +08:00
    qwjhb
    qwjhb
    Feb 11, 2020
    1
    exec('a=[6898,"RAAF Williams, Laverton Base","Laverton","Australia","YLVT",-37.86360168457031,144.74600219726562,18,10,"O","Australia/Hobart","airport","OurAirports"]')
    retanoj
    retanoj
    Feb 11, 2020 via iPhone
    2
    好方法,命令执行 /代码执行严重漏洞都你这么写出来的
    retanoj
    retanoj
    Feb 11, 2020
    3
    wuwukai007
    wuwukai007
    Feb 11, 2020 via Android❤️1
    4
    正则表达式,如果单词是有引号的话
    huyinjie
    huyinjie
    OP
    Feb 11, 2020
    5
    @wuwukai007 #4 看来只能用 ^(\d+),(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+)$ 这种来分离了
    retanoj
    retanoj
    Feb 11, 2020
    7
    不好意思,贴乱了
    试试这个
    import csv
    >>> list(csv.reader([your_string]))
    noreply69
    noreply69
    Feb 11, 2020
    9
    import csv
    s = '6898,"RAAF Williams, Laverton Base","Laverton","Australia",\\N,"YLVT",-37.86360168457031,144.74600219726562,18,10,"O","Australia/Hobart","airport","OurAirports"'
    splitted = list(csv.reader([s], delimiter=',', quotechar='"'))[0]
    print(splitted)
    noreply69
    noreply69
    Feb 11, 2020
    10
    ```
    import csv

    s = '6898,"RAAF Williams, Laverton Base","Laverton","Australia",\\N,"YLVT",-37.86360168457031,144.74600219726562,18,10,"O","Australia/Hobart","airport","OurAirports"'

    splitted = list(csv.reader([s], delimiter=',', quotechar='"'))[0]

    print(splitted)
    ```
    qwjhb
    qwjhb
    Feb 12, 2020
    11
    @retanoj 能不能用? 脚本处理现成格式化文本怕人插命令进来? 干脆删了 exec 好了
    Akkuman
    Akkuman
    Feb 12, 2020 via Android❤️1
    12
    ast.literal_eval('[6898,"RAAF Williams, Laverton Base","Laverton","Australia","YLVT",-37.86360168457031,144.74600219726562,18,10,"O","Australia/Hobart","airport","OurAirports"]')
    huyinjie
    huyinjie
    OP
    Feb 12, 2020
    13
    @noreply69 #9
    @retanoj #7

    感谢 这两段代码都能解决
    huyinjie
    huyinjie
    OP
    Feb 12, 2020
    14
    @Akkuman #12
    @qwjhb #11
    因为是从文本文件一行一行读取 你们括号里的部分相当于已经成功分离了==
    Akkuman
    Akkuman
    Feb 12, 2020 via Android
    15
    @huyinjie 不是成功分离,只是前后拼接了方括号
    retanoj
    retanoj
    Feb 12, 2020 via iPhone
    16
    @qwjhb
    是的,能用能用。
    你知道的,一句“能不能用?”已经能说明很多问题了。
    levelworm
    levelworm
    Feb 12, 2020❤️1
    17
    当中那个\N 能去掉吗?不去掉的话好像报错?
    noqwerty
    noqwerty
    Feb 12, 2020 via Android❤️1
    18
    直接整个 csv 文件也可以读进来的
    smallpython
    smallpython
    Feb 12, 2020❤️1
    19
    s = your_str
    shuangyinhao_count = 0
    result = []
    temp = ''

    for i in s:
    if i == '"':
    shuangyinhao_count += 1
    elif i == ',':
    if shuangyinhao_count == 1: # 当双引号数量为 1 时,继续添加字符而不做处理
    temp += i
    else:
    result.append(temp)
    temp = ''
    else:
    temp += i

    if shuangyinhao_count == 2:
    shuangyinhao_count = 0

    result.append(temp)

    print(result)
    araraloren
    araraloren
    Feb 12, 2020❤️1
    20
    正则分隔
    import re

    str = '6898,"RAAF Williams, Laverton Base","Laverton","Australia",\\N,"YLVT",-37.86360168457031,144.74600219726562,18,10,"O","Australia/Hobart","airport","OurAirports"'
    pattern = re.compile(r'\"[^\"]+\"\,|[^\"\,]+\,');
    print(pattern.findall(str))
    chenstack
    chenstack
    Feb 12, 2020❤️1
    21
    @qwjhb @retanoj 安全地解析字符串成 Python 对象可以用 ast.literal_eval,遇到运算符会抛出异常


    import ast
    ast.literal_eval('6898,"RAAF Williams, Laverton Base","Laverton","Australia","N","YLVT",-37.86360168457031,144.74600219726562,18,10,"O","Australia/Hobart","airport","OurAirports"')
    (6898, 'RAAF Williams, Laverton Base', 'Laverton', 'Australia', 'YLVT', -37.86360168457031, 144.74600219726562, 18, 10, 'O', 'Australia/Hobart', 'airport', 'OurAirports')
    huyinjie
    huyinjie
    OP
    Feb 12, 2020
    22
    @Akkuman #15 感谢 可以使用
    huyinjie
    huyinjie
    OP
    Feb 12, 2020
    23
    @smallpython #19 感谢 这种相当于 C 语言中 getchar 最初想到这个方法就是感觉麻烦些
    huyinjie
    huyinjie
    OP
    Feb 12, 2020
    24
    @chenstack #21
    N 两边没有双引号 ast.literal_eval 无法解析
    huyinjie
    huyinjie
    OP
    Feb 12, 2020❤️1
    25
    @levelworm #17 是的 不去掉会报错 可以使用 replace 成"\N"的方法曲线解决==
    levelworm
    levelworm
    Feb 13, 2020
    26
    @huyinjie 多谢,这样要不写个简单的 parser 吧?虽然我觉得上面的一些解法更简单。
    larsenlouis
    larsenlouis
    Feb 14, 2020
    27
    pandas 用条件扩充字段
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1511 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 59ms · UTC 15:34 · PVG 23:34 · LAX 07:34 · JFK 10:34
    ♥ Do have faith in what you're doing.