根据地区设置在Python中使用CSV列表分隔符
如何在用户的电脑上用Python检测列表分隔符?
我们需要在用户的电脑上创建一个CSV文件,并且要自动检测列表分隔符(这样Excel才能读取这个CSV文件)。
我发现Excel的CSV元素分隔符来自于“区域选项 -> 数字 -> 列表分隔符”。Python中的locale模块可以用来检测文化设置,但它(locale.localeconv)并不包含列表分隔符。用dialect='excel'打开CSV写入器也没有帮助。有没有什么办法可以获取正确的分隔符?
补充
以下代码似乎可以工作(但我不能接受任何点赞,因为这个解决方案不是我想出来的)
import locale
langlocale = locale.getdefaultlocale()[0]
locale.setlocale(locale.LC_ALL, langlocale)
dp = locale.localeconv()['decimal_point']
delimiter = ','
if dp == ',':
delimiter = ';'
3 个回答
我使用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> 这可以通过使用locale模块来简单实现。但我简单看了一下locale模块,似乎没有办法获取列表分隔符(可能它不符合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文件。
这里提供了一个方法,可以从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())
使用 xlwt 来写一个 XLS 文件。
第二种方法: 使用 locale 模块和一些经验法则:
>>> 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)
',' ';'
>>>