Python xlsx 转 csv
Python xlsx to csv
我正在使用此代码将 excel 转换为 csv 文件,问题是某些字段的文本用双引号括起来,当它进行转换时,我认为它包含在双引号空格。
我怎样才能避免这种情况?
import xlrd
import unicodecsv
import sys
def xls_to_csv (xls_filename, csv_filename):
wb = xlrd.open_workbook(xls_filename)
sh = wb.sheet_by_index(0)
fh = open(csv_filename,"wb")
csv_out = unicodecsv.writer(fh, encoding='utf-8', delimiter=';')
for row_number in range (1,sh.nrows):
csv_out.writerow(sh.row_values(row_number))
fh.close()
xls_to_csv(sys.argv[1],sys.argv[2])
Excel 文件:
实际输出:
我的目标是不带额外双引号的 CSV。
您可以在编写每个单元格之前删除所有现有引号,如下所示:
def xls_to_csv(xls_filename, csv_filename):
wb = xlrd.open_workbook(xls_filename)
sh = wb.sheet_by_index(0)
with open(csv_filename,"wb") as fh:
csv_out = unicodecsv.writer(fh, encoding='utf-8', delimiter=';')
for row_number in range (1, sh.nrows):
row = []
for col in sh.row_values(row_number):
try:
row.append(col.strip('"'))
except AttributeError:
row.append(col)
csv_out.writerow(row)
xls_to_csv(sys.argv[1],sys.argv[2])
如果您想在一个函数中完成:
import xlrd
import unicodecsv
import sys
def xls_to_csv (xls_filename, csv_filename):
wb = xlrd.open_workbook(xls_filename)
sh = wb.sheet_by_index(0)
fh = open(csv_filename,"wb")
csv_out = unicodecsv.writer(fh, encoding='utf-8', delimiter=';')
for row_number in range (1,sh.nrows):
row = []
row = [s.replace('"', '') for s in sh.row_values(row_number)]
csv_out.writerow(row)
fh.close()
xls_to_csv(sys.argv[1],sys.argv[2])
"additional" 引号本身不是 数据。最外面的引号(每端 one)只是字符串定界符。当实际数据包含引号时,这些定界符在 CSV Excel 方言中是强制性的 ,而您的确实如此。在字符串定界符中,实际引号需要加倍 "escaped"。 (第一个未转义的引号将被解释为结束字符串定界符。)
听起来您正在尝试编写 custom dialect of CSV,但 Excel 不打算使用它。所以你必须相应地调整参数:
csv_out = unicodecsv.writer(
fh,
encoding='utf-8',
delimiter=';',
quoting=unicodecsv.QUOTE_NONE,
quotechar=None)
这些设置将保留现有的 data 引号字符,但会阻止添加任何 delimiter 引号字符。 (也就是说,上面的设置会 never 添加 any 定界引号 anywhere。)代码可以保持完全相同。
有关详细信息,请阅读 Python 2's CSV docs carefully. (I assume you are using Python 2 because you are using unicodecsv
。它旨在尽可能模仿 csv
模块的界面。其实推荐的使用方式是这样导入:
import unicodecsv as csv
这样你的代码的其余部分看起来 完全 就好像你在使用 Python 自己的 csv
,除了可能的 [=15] =] 参数。顺便说一句,如果您需要的编码是 UTF-8,则可以省略该参数。)
我正在使用此代码将 excel 转换为 csv 文件,问题是某些字段的文本用双引号括起来,当它进行转换时,我认为它包含在双引号空格。 我怎样才能避免这种情况?
import xlrd
import unicodecsv
import sys
def xls_to_csv (xls_filename, csv_filename):
wb = xlrd.open_workbook(xls_filename)
sh = wb.sheet_by_index(0)
fh = open(csv_filename,"wb")
csv_out = unicodecsv.writer(fh, encoding='utf-8', delimiter=';')
for row_number in range (1,sh.nrows):
csv_out.writerow(sh.row_values(row_number))
fh.close()
xls_to_csv(sys.argv[1],sys.argv[2])
Excel 文件:
实际输出:
我的目标是不带额外双引号的 CSV。
您可以在编写每个单元格之前删除所有现有引号,如下所示:
def xls_to_csv(xls_filename, csv_filename):
wb = xlrd.open_workbook(xls_filename)
sh = wb.sheet_by_index(0)
with open(csv_filename,"wb") as fh:
csv_out = unicodecsv.writer(fh, encoding='utf-8', delimiter=';')
for row_number in range (1, sh.nrows):
row = []
for col in sh.row_values(row_number):
try:
row.append(col.strip('"'))
except AttributeError:
row.append(col)
csv_out.writerow(row)
xls_to_csv(sys.argv[1],sys.argv[2])
如果您想在一个函数中完成:
import xlrd
import unicodecsv
import sys
def xls_to_csv (xls_filename, csv_filename):
wb = xlrd.open_workbook(xls_filename)
sh = wb.sheet_by_index(0)
fh = open(csv_filename,"wb")
csv_out = unicodecsv.writer(fh, encoding='utf-8', delimiter=';')
for row_number in range (1,sh.nrows):
row = []
row = [s.replace('"', '') for s in sh.row_values(row_number)]
csv_out.writerow(row)
fh.close()
xls_to_csv(sys.argv[1],sys.argv[2])
"additional" 引号本身不是 数据。最外面的引号(每端 one)只是字符串定界符。当实际数据包含引号时,这些定界符在 CSV Excel 方言中是强制性的 ,而您的确实如此。在字符串定界符中,实际引号需要加倍 "escaped"。 (第一个未转义的引号将被解释为结束字符串定界符。)
听起来您正在尝试编写 custom dialect of CSV,但 Excel 不打算使用它。所以你必须相应地调整参数:
csv_out = unicodecsv.writer(
fh,
encoding='utf-8',
delimiter=';',
quoting=unicodecsv.QUOTE_NONE,
quotechar=None)
这些设置将保留现有的 data 引号字符,但会阻止添加任何 delimiter 引号字符。 (也就是说,上面的设置会 never 添加 any 定界引号 anywhere。)代码可以保持完全相同。
有关详细信息,请阅读 Python 2's CSV docs carefully. (I assume you are using Python 2 because you are using unicodecsv
。它旨在尽可能模仿 csv
模块的界面。其实推荐的使用方式是这样导入:
import unicodecsv as csv
这样你的代码的其余部分看起来 完全 就好像你在使用 Python 自己的 csv
,除了可能的 [=15] =] 参数。顺便说一句,如果您需要的编码是 UTF-8,则可以省略该参数。)