基于区域设置的python csv列表分隔符

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

如何使用Python检测用户机器中的列表分隔符?

需要在用户计算机上创建 CSV 文件,并且必须自动检测列表分隔符(以便 Excel 可以读取 CSV 文件)。

我发现 Excel 从“区域选项 -> 数字 -> 列表分隔符”中获取 CSV 元素分隔符。 Python 中的 locale 模块用于检测文化设置,但它(locale.localeconv)不包含列表分隔符。使用 dialect='excel' 打开 CSV writer 没有帮助。知道如何获得正确的分隔符吗?

编辑

以下代码似乎有效(但不能接受任何赞成票,因为解决方案不是我的)

import locale

langlocale = locale.getdefaultlocale()[0]
locale.setlocale(locale.LC_ALL, langlocale)
dp = locale.localeconv()['decimal_point']
delimiter = ','
if dp == ',':
    delimiter = ';'
python csv
3个回答
5
投票

提供了从 Windows 注册表中读取列表分隔符的想法。

提供了访问 Windows 注册表值的代码。

使用 _winreg 包,可以从注册表中检索 Windows 列表分隔符值,如下所示:

from _winreg import *

def getListSeparator():
    '''Retrieves the Windows list separator character from the registry'''
    aReg = ConnectRegistry(None, HKEY_CURRENT_USER)
    aKey = OpenKey(aReg, r"Control Panel\International")
    val = QueryValueEx(aKey, "sList")[0]
    return val

print getListSeparator()

或者对于最近的 Python 版本:

import winreg

def getListSeparator():
    '''Retrieves the Windows list separator character from the registry'''
    aReg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER)
    aKey = winreg.OpenKey(aReg, r"Control Panel\International")
    return winreg.QueryValueEx(aKey, "sList")[0]

print(getListSeparator())

4
投票

使用 xlwt 写入 XLS 文件。

采取 2: 使用区域设置模块和一些启发式方法:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, '') # set to user's locale, not "C"
'English_Australia.1252'
>>> dec_pt_chr = locale.localeconv()['decimal_point']
>>> if dec_pt_chr == ",":
...     list_delimiter = ";"
... else:
...     list_delimiter = ","
...
>>> print repr(dec_pt_chr), repr(list_delimiter)
'.' ','
>>> locale.setlocale(locale.LC_ALL, 'French_France.1252')
'French_France.1252'
>>> dec_pt_chr = locale.localeconv()['decimal_point']
>>> if dec_pt_chr == ",":
...     list_delimiter = ";"
... else:
...     list_delimiter = ","
...
>>> print repr(dec_pt_chr), repr(list_delimiter)
',' ';'
>>>

2
投票

我使用 sniff 自动检测它:

import csv

dialect = csv.Sniffer().sniff(file.readline())
file.seek(0)
file.readline()
file.seek(0)
fieldnames=( 'assignatura', 'professor', 'grup',  )
reader = csv.DictReader(file, fieldnames=fieldnames, dialect=dialect )

for row in reader:

        codiFranja = unicode(row['assignatura'],'iso-8859-1')
        ...

编辑:

如果您计划从 python 创建 csv 并从 excel 读取它,那么您需要创建带有区域设置分隔符的文件。但 python csv 模块不使用区域设置:http://mail.python.org/pipermail/csv/2003-May/000507.html

Andreas> 使用语言环境实现这可能非常简单 模块。但我简单地看了一下语言环境模块,它 似乎没有办法获得列表分隔符 (可能这不是 POSIX 投诉)。

解决方法可能是在基于区域设置桌面计算机的每个 python 用户客户端安装上的配置文件上写入分隔符,并在 python 生成 csv 文件时读取此分隔符。

您还可以编写 vbscript 代码来创建 excel 文件并将其导出到 csv,然后每次需要创建 python csv 文件时查找分隔符。

也许最优雅的解决方案是使用 schema.ini: http://msdn.microsoft.com/en-us/library/windows/desktop/ms709353(v=vs.85).aspx 。您可以生成 csv 文件,并在同一文件夹中生成 schema.ini 文件。

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