◆ add に指定したフォルダがルートになるわけじゃない
  ◆ add に指定した文字列部分も含まれる
◆ arcname 引数で指定フォルダより上のパスを変更できる
  ◆ 空文字にすると指定フォルダが tar のルートになる

Python で tar を作るときにちょっと困りました
余計なパスが含まれます

こういうプログラムで tar ファイルを作って展開します

data_dir が tar ファイルに含めるターゲットのフォルダです
ここにはダミーデータを適当に作ります
tar ファイルは output_dir に出力して extract_dir に展開します

import os, tarfile, shutil

data_dir = "a/b/c"
output_dir = "p/q/r"
extract_dir = "x/y/z"

for dir in [data_dir, output_dir, extract_dir]:
os.makedirs(dir, exist_ok=True)


# data_dir に適当にファイル作る

def write_file(path):
body = path
fullpath = os.path.join(data_dir, path)
os.makedirs(os.path.dirname(fullpath), exist_ok=True)
with open(fullpath, "w") as f:
f.write(body)

def make_dummy():
write_file("file1.txt")
write_file("file2.txt")
write_file("dir1/file3.txt")
write_file("dir1/file4.txt")
write_file("dir2/file5.txt")
write_file("dir3/file6.txt")

make_dummy()

# tar の作成と展開

tar_path = os.path.join(output_dir, "data.tar.gz")

with tarfile.open(tar_path, "x:gz") as f:
f.add(data_dir)

with tarfile.open(tar_path, "r") as f:
f.extractall(extract_dir)

# tree

def tree(path, indent=2):
for root, dirs, files in os.walk(path):
depth = root.replace(path, "").count(os.sep)
space = " " * (indent * depth)
dirname = os.path.basename(root)
print(f"{space}{dirname}/")
subspace = " " * (indent * (depth + 1))
for file in files:
print(f"{subspace}{file}")

print("=== data dir ===")
tree(data_dir)
print("=== extract dir ===")
tree(extract_dir)

展開後の data_dir と extract_dir の tree 表示が出力です
結果はこうなりました

=== data dir ===
c/
file1.txt
file2.txt
dir1/
file3.txt
file4.txt
dir2/
file5.txt
dir3/
file6.txt
=== extract dir ===
z/
a/
b/
c/
file1.txt
file2.txt
dir1/
file3.txt
file4.txt
dir2/
file5.txt
dir3/
file6.txt

a/b/c が z の中に入っています
tar への追加で add に data_dir (a/b/c) を渡してるから a からパスに含まれてしまうようです

data_dir に移動してカレントディレクトリを add すれば余計なパスは入らない気がしますが カレントディレクトリの移動は面倒ですしあまりしたくないです
方法はないか探すと arcname という引数が使えました

with tarfile.open(tar_path, "x:gz") as f:
f.add(data_dir, arcname="")

に置き換えると

=== data dir ===
c/
file1.txt
file2.txt
dir1/
file3.txt
file4.txt
dir2/
file5.txt
dir3/
file6.txt
=== extract dir ===
z/
file1.txt
file2.txt
dir1/
file3.txt
file4.txt
dir2/
file5.txt
dir3/
file6.txt

期待通り余計なパスはなくなり add に指定したフォルダがルートになりました

arcname に好きなパスを指定すると指定したフォルダまでのパスを自由に変更できます

with tarfile.open(tar_path, "x:gz") as f:
f.add(data_dir, arcname="foo/bar")

にすると

=== data dir ===
c/
file1.txt
file2.txt
dir1/
file3.txt
file4.txt
dir2/
file5.txt
dir3/
file6.txt
=== extract dir ===
z/
foo/
bar/
file1.txt
file2.txt
dir1/
file3.txt
file4.txt
dir2/
file5.txt
dir3/
file6.txt

デフォルトは空文字で良いと思うんですけどねー