首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >学习Python - len()返回2n+2

学习Python - len()返回2n+2
EN

Stack Overflow用户
提问于 2022-11-15 21:33:01
回答 3查看 81关注 0票数 -2

很抱歉,如果这是一个重复的帖子,但搜索似乎没有产生有用的results...or,也许我是一个菜鸟,我不明白什么是在回答。

我编写了这段用于实践的小代码(遵循“艰难学习Python的方法”)。我试图制作一个已经给我的代码的更短的版本。

代码语言:javascript
复制
from sys import argv

script, from_file, to_file = argv

# here is the part where I tried to simplify the commands and see if I still get the same result,
# Turns out it's the same 2n+2
trial = open(from_file)
trial_data = trial.read()
print(len(trial_data))
trial.close()

# actual code after defining the argumentative variables
in_file = open(from_file).read()

input(f"Transfering {len(in_file)} characters from {from_file} to {to_file}, hit RETURN to continue, CRTL-C to abort.")
#'in_data = in_file.read()

out_file = open(to_file, 'w').write(in_file)

当使用len()时,它似乎总是返回2n+2值而不是n,其中n是文本文件中的实际字符数。我还确保文本文件中没有额外的行。

有人能解释一下吗?

提亚

我期望返回txt文件中的确切字符数。原来这要求太高了。

编辑:既然很多人都在要求一个实用的example....here,所以它说:

代码语言:javascript
复制
The poem 
dedicated to Puxijn
The Chonk one

我得到的是

代码语言:javascript
复制
ÿþT h e   p o e m

 d e d i c a t e d   t o   P u x i j n

 T h e   C h o n k   o n e

我认为这是一个编码问题。如果有任何帮助的话,我正在使用最新的python。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-11-17 21:01:44

根据您更新的问题,您肯定是使用语言环境默认编码从UTF-16编码文本文件中读取(可能是latin-1cp1252,这两种编码都会将UTF-16 BOM解码为ÿþ;Windows通常使用cp1252作为默认值,而latin-1虽然在今天基本上被UTF-8所取代,但在较旧的UNIX上是一个流行的地区-很长时间以来都很喜欢)。这些编码将无错误地读取任何旧字节,即使编码错误(它们将所有256个字节映射为一个匹配的256个字符),产生胡言乱语(用于ASCII范围以外的字节)和奇怪的空白(对于UTF-16中每个ASCII字符之前的空字节)。

更改所有open调用以添加一个额外的参数,encoding='utf-16',例如:

代码语言:javascript
复制
trial = open(from_file, encoding='utf-16')

Python将使用正确的文本编码将原始字节解码为str,并且所有长度都将匹配。

或者,当将文件保存在合理的编辑器中时,一定要调整编码,使其成为Python默认使用的编码(在现代Python中,不管地区设置如何,UTF-8可能是最流行的可移植编码,部分原因是对于纯ASCII文本,它与ASCII相同,不会浪费磁盘空间)。

票数 1
EN

Stack Overflow用户

发布于 2022-11-15 21:37:40

这些额外的字符可能是新的行字符,还是其他不可见的文本编辑器字符?

尝试只使用一个字符创建一个简单的测试文件。如跑

代码语言:javascript
复制
echo "a" > test_file

此外,还有一个专用的bash命令来计算这些内容。

代码语言:javascript
复制
wc -m
票数 -2
EN

Stack Overflow用户

发布于 2022-11-15 21:42:33

观察到的行为与以二进制模式打开文件和用BOM以utf-16编码的文件是一致的。

如果然后对该文件的内容调用len,它将计算该文件中的字节数。字节的数量将取决于特定的编码。

这将解释两个2n原因,每utf-16字符有两个字节,以及+ 2,BOM换行符。

票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74452431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档