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

基于区域设置的python csv列表分隔符,python,csv,Python,Csv,如何使用Python检测用户机器中的列表分隔符 需要在用户计算机上创建CSV文件,并且必须自动检测列表分隔符(以便excel可以读取CSV文件) 我发现Excel使用“区域选项->数字->列表分隔符”中的CSV元素分隔符。Python中的locale模块用于检测文化设置,但它(locale.localeconv)不包含列表分隔符。用方言='excel'打开CSV编写器没有帮助。知道如何找到正确的分隔符吗 编辑 以下代码似乎有效(但无法接受任何升级投票,因为解决方案不是我的) 我使用自动检测: i

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

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

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

编辑

以下代码似乎有效(但无法接受任何升级投票,因为解决方案不是我的)

我使用自动检测:

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模块不使用区域设置:

Andreas>使用区域设置实现这一点非常简单 模块。但是我简单地看了一下locale模块,它 似乎无法获得列表分隔符符号 (可能不是POSIX投诉)

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

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

也许最优雅的解决方案是使用schema.ini:。您可以生成csv文件,并在同一个文件夹中生成schema.ini文件。

使用编写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)
',' ';'
>>>
提供了从Windows注册表读取列表分隔符符号的想法

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

使用,可以从注册表中检索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()

csv事先不存在。它必须在用户计算机中创建,csv文件中的分隔符(可能是.or;)必须基于用户计算机(而不是我的电脑)中的区域设置,我理解。您希望使用用户计算机cvs分隔配置从python创建csv文件。您需要这种行为,以便可以从excel中读取文件。是吗?Wikipedia说将.csv改为.txt可能是一种解决方案:Microsoft Excel将打开.csv文件,但根据系统的区域设置,它可能希望使用分号作为分隔符,而不是逗号,因为在某些语言中,逗号用作十进制分隔符。此外,许多地区版本的Excel将无法处理CSV中的Unicode。遇到这种困难时,一个简单的解决方案是将文件扩展名从.csv改为.txt;然后使用“打开”命令从已运行的Excel打开文件。().txt似乎是一种解决方法,但我最好不能要求用户执行文本导入向导(特别是因为经常会创建新的csv文件)。好的,这里是我的第二种解决方法。使用schema.ini文件覆盖csv分隔的区域设置:。Python csv模块不使用区域设置:您不需要调用
getdefaultlocale
——请参阅我的答案。顺便说一句,Excel完全错了。对于CSV,逗号始终是字段分隔符,而与区域设置无关;否则它就不会被称为CSV!读取和写入字段中包含逗号的CSV的正确方法是将字段用双引号括起来。否则,任何CSV读写器都有故障。
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()