在 Python 中读取 csv 文件时获取“字符串中的换行符”?
Posted
技术标签:
【中文标题】在 Python 中读取 csv 文件时获取“字符串中的换行符”?【英文标题】:Getting "newline inside string" while reading the csv file in Python? 【发布时间】:2012-07-06 22:33:30 【问题描述】:我在 Django 架构中有这个 utils.py 文件:
def range_data(ip):
r = []
f = open(os.path.join(settings.PROJECT_ROOT, 'static', 'csv ',
'GeoIPCountryWhois.csv'))
for num,row in enumerate(csv.reader(f)):
if row[0] <= ip <= row[1]:
r.append([r[4]])
return r
else:
continue
return r
这里的 ip 参数只是 IPv4 地址,我使用的是开源 MAXMIND GeoIPCountrywhois.csv
文件。
GeopIOCountrywhois.csv
的一些起始内容:
"1.0.0.0","1.0.0.255","16777216","16777471","AU","Australia"
"1.0.1.0","1.0.3.255","16777472","16778239","CN","China"
"1.0.4.0","1.0.7.255","16778240","16779263","AU","Australia"
"1.0.8.0","1.0.15.255","16779264","16781311","CN","China"
"1.0.16.0","1.0.31.255","16781312","16785407","JP","Japan"
"1.0.32.0","1.0.63.255","16785408","16793599","CN","China"
"1.0.64.0","1.0.127.255","16793600","16809983","JP","Japan"
"1.0.128.0","1.0.255.255","16809984","16842751","TH","Thailand"
我也读过这个问题,但没有发现这么多可以理解的。你能帮我解决这个错误吗?
根据我在utils中的方法,我正在检查该方法的paasing参数IP
地址的国家名称。
【问题讨论】:
【参考方案1】:今天早些时候遇到了类似的问题,一行中缺少一个结束引号,解决方法是指示reader
对引号字符(quoting=csv.QUOTE_NONE
)不进行特殊处理。
【讨论】:
这是错误的正确答案,因为它是由未结束的引号引起的,就像我的情况一样。非常感谢。 这解决了我的问题,接受的答案没有。我遇到了类似的错误 非常感谢,这就是解决方案! 这仅在不使用引号来转义列值中存在的分隔符时才有效。使用csv.QUOTE_NONE
,您仍然需要手动去除引号。【参考方案2】:
您可以通过删除换行符来预处理 csv,如下所示。
import csv
content = open("GeoIPCountryWhois.csv", "r").read().replace('\r\n','\n')
with open("GeoIPCountryWhois2.csv", "w") as g:
g.write(content)
然后将 GeoIPCountryWhois2 用于 csv 阅读器。
使用 lineterminator 的疯狂猜测可能会解决您的问题
for num,row in enumerate(csv.reader(f,lineterminator='\n'))
另请参阅:http://docs.python.org/lib/csv-fmt-params.html
【讨论】:
lineterminator
关键字参数 csv.reader()
被明确记录为被忽略。您需要以二进制模式打开文件对象,以便csv
模块本身可以正确处理换行符。
您提供的链接已损坏!
这很有用。但是,我发现以下轻微改动起作用了:f.read().replace('\r',' ')
。我猜可能是系统相关的。【参考方案3】:
您必须以二进制形式打开文件:
def range_data(ip):
r = []
f = open(os.path.join(settings.PROJECT_ROOT, 'static', 'csv ',
'GeoIPCountryWhois.csv'), 'rb')
for num,row in enumerate(csv.reader(f)):
# Your things.
注意那里的'rb'
模式;否则文件可能会以本机行结尾打开,并且 CSV 阅读器不能很好地处理各种形式。当然,我下载的GeoIPCountryWhois.csv
的副本有干净的\n
行尾。
这是为.reader() method 记录的:
如果 csvfile 是文件对象,则必须在不同的平台上使用“b”标志打开它。
但是,如果您的 csv 文件严重损坏,以至于在意外的地方仍然包含意外的换行符,请改用此 file
子类作为权宜之计:
class CleanlinesFile(file):
def next(self):
line = super(CleanlinesFile, self).next()
return line.replace('\r', '').replace('\n', '') + '\n'
这个类保证在返回的结果中除了最后一个字符之外没有换行符(正如 csv 模块想要的那样)。使用它代替open
调用;在这种情况下,'rb'
模式修饰符变为可选:
def range_data(ip):
r = []
f = CleanlinesFile(os.path.join(settings.PROJECT_ROOT, 'static', 'csv ',
'GeoIPCountryWhois.csv'))
for num,row in enumerate(csv.reader(f)):
# Your things.
【讨论】:
以上是关于在 Python 中读取 csv 文件时获取“字符串中的换行符”?的主要内容,如果未能解决你的问题,请参考以下文章