将文本文件添加到代码的开头会导致解析错误

本文关键字:错误 开头 文件 文本 添加 代码 | 更新日期: 2023-09-27 18:03:13

我正在使用这个python脚本在我所有的c#脚本的开头添加版权演讲

import re
import shutil
import os
copyrightloc =  'C:/DATA/pyscripts/copyright.txt'
rootdir = 'C:/DATA/pyscripts/02_CODE'
dstdir = 'C:/DATA/pyscripts/codecopy'
spielfile =  open(copyrightloc, "r") 
spiel = spielfile.read() 
for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        if file.endswith(".cs"):
            with open(subdir+'/'+file, "r+") as codefile ,  open(dstdir+'/'+file, 'w') as destfile:
                destfile.write(spiel+''n' + codefile.read())

正如您所看到的,我正在将原始字符串添加到版权字符串中,并将其写入新文件。

文件完成时看起来很好,但在每个文件中,在原始文件的第一行,我得到一个解析错误。例如,下面显示了新文件中版权标识末尾和原始文件开头的摘录…

          BLAH BLAH BLAH COPYRIGHT
  * OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
  * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
  * CONTRACT, NEGLIGENCE, TORT OR OTHERWISE, ARISING OUT OF OR IN
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE OR ITS DERIVATIVES.
  */

using UnityEngine;   [!!!ERROR IS SHOWN ON THIS LINE!!!]
using System.Collections;
public class Floop : MonoBehaviour {
    public rot glorb;
    public GameObject foo;
              BLAH BLAH BLAH MY CODE

我猜那里有一些不可见的字符,如"文件结束"或其他东西,但我在notepad++中看不到任何东西,当我选择"显示所有字符"…如果我转到问题行的开头并点击删除,错误就会消失。我怎样才能使我的python脚本避免这个问题?

将文本文件添加到代码的开头会导致解析错误

MSDN c#风格指南说你不应该在注释周围使用星号。你能试着在版权的每一行前加上//吗?

或者,您也可以使用这种格式(注意每行开头没有星号):

/*
copyright here
*/

也许你的文件包含一个'字节顺序标记',这是一些特殊的字符,在文件的开头表示编码。

如果您在期望的字符之前看到一些额外的字符,请使用HEX编辑器检查。

如果是这种情况,那么您应该使用'utf-8-sig'编码。我不是python导出,但你的代码可能看起来像这样

...
spielfile =  codecs.open(copyrightloc, "r", encoding="utf-8-sig")
...
with codecs.open(subdir+'/'+file, "r+", encoding="utf-8-sig") as codefile ,  open(dstdir+'/'+file, 'w', encoding="utf-8-sig") as destfile:

在版权文本中有可能存在未正确编码的unicode字符尝试使用codecs模块

import re
import shutil
import os
import codecs
copyrightloc =  'C:/DATA/pyscripts/copyright.txt'
rootdir = 'C:/DATA/pyscripts/02_CODE'
dstdir = 'C:/DATA/pyscripts/codecopy'
spielfile =  codecs.open(copyrightloc, "r", encoding="utf8") 
spiel = spielfile.read() 
for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        if file.endswith(".cs"):
            with codecs.open(subdir+'/'+file, "r+",encoding="utf8") as codefile ,  open(dstdir+'/'+file, 'w') as destfile:
                destfile.write(spiel+''n' + codefile.read())