如何使用Python检测用户机器中的列表分隔符?
需要在用户计算机上创建CSV文件,并且必须自动检测列表分隔符(以便excel可以读取CSV文件)。
我发现Excel从“区域选项 - >数字 - >列表分隔符”中获取CSV元素分隔符。 Python中的locale模块用于检测文化设置,但它(locale.localeconv)不包含列表分隔符。用dialect ='excel'打开CSV编写器没有帮助。知道如何获得正确的分隔符吗?
修改
以下代码似乎有效(但不能接受任何upvotes,因为解决方案不是我的)
import locale
langlocale = locale.getdefaultlocale()[0]
locale.setlocale(locale.LC_ALL, langlocale)
dp = locale.localeconv()['decimal_point']
delimiter = ','
if dp == ',':
delimiter = ';'
答案 0 :(得分:2)
提供了从Windows注册表中读取列表分隔符号的想法。
提供访问Windows注册表值的代码。
使用_winreg package,可以从注册表中检索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()
答案 1 :(得分:1)
我使用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中读取它,那么您需要使用locale delimiter创建文件。但python csv模块不使用区域设置:http://mail.python.org/pipermail/csv/2003-May/000507.html
安德烈亚斯&GT;使用语言环境实现起来非常简单 模块。但我简短地看了一下locale模块和它 好像没有办法得到列表分隔符号 (可能不是POSIX投诉)。
解决方法可能是在基于语言环境桌面计算机的每个python用户客户端安装上的配置文件上编写分隔符,并在python make csv文件时读取此分隔符。
此外,您可以编写创建和优化文件的vbscript代码并将其导出到csv,然后在每次需要创建python csv文件时查找分隔符。
也许最优雅的解决方案是使用schema.ini:http://msdn.microsoft.com/en-us/library/windows/desktop/ms709353(v=vs.85).aspx。您可以生成csv文件,并在同一个foleder中生成schema.ini文件。
答案 2 :(得分:1)
使用xlwt写一个XLS文件。
Take 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)
',' ';'
>>>